c# – Nhibernate在select上做更新?

c# – Nhibernate在select上做更新?,第1张

概述我有以下课程: public class Product{ public virtual Guid Id { get; set; } public virtual string Name { get; set; } public virtual Decimal PricePerMonth { get; set; } public virtual BillingInterval D 我有以下课程:
public class Product{  public virtual GuID ID { get; set; }  public virtual string name { get; set; }  public virtual Decimal PricePerMonth { get; set; }  public virtual BillingInterval DefaultBillingInterval { get; set; }  public virtual string Additionalinfo { get; set; }}

并且映射看起来像这样:

<class name="Product" table="Products">    <ID name="ID" column="ProductID">      <generator />    </ID>    <property name="name" column="Productname" not-null="true" type="String" />    <property name="PricePerMonth" column="PricePerMonth" not-null="true" type="Decimal" />    <property name="DefaultBillingInterval" type="int" not-null="true" />    <property name="Additionalinfo" type="string" not-null="false" /></class>

我使用Repository< T>使用以下方法的类(Session是返回当前会话的属性):

public IEnumerable<T> FindAll(DetachedCriteria criteria){  return criteria.GetExecutableCriteria(Session).List<T>();}

现在,当我执行以下 *** 作时(会话与存储库中使用的会话相同):

IEnumerable<ProductDTO> productDTOs = null;using(ITransaction tx = session.BeginTransaction(IsolationLevel.ReadCommitted)){    var products = repository.FindAll(new DetachedCriteria.For<Product>().Add(Restrictions.like("name","Some Product%")));    productDTOs = ToDTOs(products);    tx.Commit();}// Do stuff with DTO's

commit语句就在那里,因为我使用了一个服务层,如果没有错误发生,它会自动提交每个事务.我刚刚在这里折叠了我的服务层,以便于实现可视化.

我的ToDTOs方法只是转换为DTO:

private IEnumerable<ProductDTO> ToDTO(IEnumerable<Product> products){  return products.Select(x => new ProductDTO()    {      ID = x.ID,name = x.name,PricePerMonth = x.PricePerMonth,Additionalinfo = x.Additionalinfo    }).ToList();}

我的nhibernate日志显示以下输出:

2010-01-04 19:13:11,140 [4] DEBUG NHibernate.sql - SELECT ... From Products ...2010-01-04 19:13:11,237 [4] DEBUG NHibernate.sql - UPDATE Products ...2010-01-04 19:13:11,548 [4] DEBUG NHibernate.sql - UPDATE Products ......

因此,通过选择产品,它会为会话提交时返回的每个产品发出更新声明,即使产品中没有任何更改.

有任何想法吗?

解决方法 当我有一个实体没有从属性返回相同的值而不是分配给它的值时,我只有这种效果.然后它被NH视为脏.

例:

class Foo{  private string name;  public string name   {     // does not return null when null had been set    get { return name ?? "No name"; }    set { name = value; }  }}

这就是我编写映射文件的方法.

<class name="Product" table="Products">    <ID name="ID" column="ProductID">      <generator />    </ID>    <property name="name" column="Productname" not-null="true" />    <property name="PricePerMonth" not-null="true" />    <property name="DefaultBillingInterval" not-null="true" />    <property name="Additionalinfo" /></class>

您不需要指定类型.它们由NHibernate在运行时确定.

总结

以上是内存溢出为你收集整理的c# – Nhibernate在select上做更新?全部内容,希望文章能够帮你解决c# – Nhibernate在select上做更新?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存