【发布时间】:2010-01-04 18:34:30
【问题描述】:
我有以下课程:
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 class="guid.comb"/>
</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
提交语句在那里,因为我使用了一个服务层,如果没有发生错误,它会自动提交每个事务。我只是在这里折叠了我的服务层以便于可视化..
我的 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();
}
我的休眠日志显示以下输出:
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 ...
...
因此,通过选择产品,它会为会话提交时返回的每个产品发出更新语句,即使产品中没有任何更改..
有什么想法吗?
【问题讨论】:
-
这真的实体是如何实现的吗?我不相信你。
-
它是...确实,我有一个附加产品的订单列表,但我已经从类和映射中删除了这个列表(如这里所示),它是同样的结果..我的困惑更加深刻,因为这不会发生在我的其他实体身上..
标签: c# .net nhibernate nhibernate-mapping