我对 NHibernate 的 IsDirty() 方法有点困惑。
从我的数据库中获取一个(非常大的)复杂对象后,NHibernate 的 ISession.IsDirty() 直接给出“真”。
IFacadeDAL fd = new FacadeDAL();
// Session's not dirty
IProject proj = fd.GetByID<IProject, string>("123611-3640");
// Session is dirty
但是,如果我这样调用 Commit() :
using (ITransaction trans = Facade.Session.Transaction)
{
trans.Begin();
Facade.Session.Save(entity);
trans.Commit();
return true;
}
这导致没有 sql(“exec sp_reset_connection”除外)。
我已经读过,由于“映射选择”,您可以在会话中获得“幽灵”(导致会话说它很脏),但它不会也尝试更新一些东西吗?此外,如果这是由例如将 sql 位“转换”为 ac# bool 引起的,我认为我无法更改它……(不过,不知道这是否可能是鬼的原因)。
更新 2: 这里涉及到几个(sql server)视图和表。这是(非常)简化的类:
public class Project : IProject
{
private string id;
private List<IPlantItem> plantItems;
public Project() { }
public virtual string ID
{
get { return id; }
}
public virtual IEnumerable<IPlantItem> PlantItems
{
get { return plantItems; }
}
}
'PlantItem被存储在一个表中。所以我希望当我更改 PlantItem 中的任何内容时,IsDirty 应该更改为“true”。
我的问题是:有没有办法检查此时的会话是否会在 flush() 上(或者在我的情况下在 commit() 上)会生成实际的 sql 语句?如果没有:是否有另一种方式(手动)存储某种会话快照以与当前会话进行比较?
更新1:我真的还应该提到这些方面:
- 我的 FlushMode 设置为“无”。
- 'IProject'-object 本身的基础数据基于 sql-view,因此映射中的大多数属性设置为 update="false"
- 当我实际更改对象中的某些内容并使用相同的保存方法时,正在发送 sql 更新语句(因此一切都很好)