Session NHibernate:如何知道是否会在Flush()上发送SQL?

Session NHibernate:如何知道是否会在Flush()上发送SQL?,session,nhibernate,flush,dirty-data,Session,Nhibernate,Flush,Dirty Data,我对NHibernate的IsDirty()方法有点困惑 从数据库中获取(非常大的)复杂对象后,NHibernate的ISession.IsDirty()直接给出“true” IFacadeDAL fd = new FacadeDAL(); // Session's not dirty IProject proj = fd.GetByID<IProject, string>("123611-3640"); // Session is dirty 这导致没有sql(exec sp_

我对NHibernate的IsDirty()方法有点困惑

从数据库中获取(非常大的)复杂对象后,NHibernate的ISession.IsDirty()直接给出“true”

IFacadeDAL fd = new FacadeDAL();
// Session's not dirty

IProject proj = fd.GetByID<IProject, string>("123611-3640");
// Session is dirty
这导致没有sql(exec sp_reset_connection除外)

我已经读到,由于“映射选择”,您可以在会话中获得“重影”(导致会话说它是脏的),但它不也会尝试更新某些内容吗?此外,如果这是由sql位“转换”为c#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; }
    }
}
公共类项目:IProject
{
私有字符串id;
私人物品清单;
公共项目(){}
公共虚拟字符串ID
{
获取{return id;}
}
公共虚拟IEnumerable项目
{
获取{return plantItems;}
}
}
“PlantItem存储在表中。因此,我希望当我更改PlantItem中的任何内容时,IsDirty应该更改为“true”

我的问题是:有没有办法检查在flush()上(或者在我的例子中,在commit()上)的会话是否会生成实际的sql语句?如果没有:是否有另一种(手动)存储会话快照的方式来比较当前会话

更新1:我还应该提到以下方面:

  • 我的刷新模式设置为“无”
  • “IProject”-对象本身的基础数据基于sql视图,因此映射集中的大多数属性都设置为update=“false”
  • 当我实际更改对象中的某些内容并使用相同的保存方法时,会发送sql update语句(因此所有内容都提交得很好)

  • 如果您的某些实体是脏的,因此ISession是脏的,那么它们的属性和数据库之间就不匹配。例如,假设表中有一列可以为null,但在代码中它被设置为notnull(例如int)。NHiBiNATE会认为它是脏的,因为它的当前值(在整数的情况下为0)与来自DB(null)的值不同。在Google中查找“Ghost properties NHibernate”。

    根据我的经验,Ghost可能是由数据库为
    可为null的int
    和映射为普通的
    int
    引起的

    当实体水合时,
    nullable db int
    被转换为
    zero
    ,因此它现在变脏了

    获取脏记录的另一种方法是在XML映射中指定错误的类型,例如

    public enum Sex
    {
     Unspecified,
     Male,
     Female
    }
    ...
    public virtual Sex Sex { get; set; }
    
    并在映射中指定一个int

     <property name="Sex" type="int"/>
    
    
    

    请参阅下面的详细说明。

    只是为了确定:您的
    刷新模式是否设置为无?如果是:为什么不在
    trans.Commit()之前调用
    session.Flush()
    ?“没有”意味着,永远不会叫同花顺。决不,在提交时也不。@Radim:Thnks Radim,但在本例中我使用nh ITransaction,因此根据以下内容:,我不必这样做。另外,所有其他功能都可以正常工作(提交更改和其他内容)。您是否可以有一个幽灵映射,使会话认为它是脏的,但由于您将其映射为
    update=“false”
    ,因此不会发送更新?脏黑客可以停止对视图的任何更新(我怀疑您有幽灵)是否要将
    添加到类映射为什么要将mutable设置为false一个肮脏的hack?我建议你看看《捉鬼敢死队》的测试,把它包括在你的测试服里。
     <property name="Sex" type="int"/>