Session NHibernate:如何知道是否会在Flush()上发送SQL?
我对NHibernate的IsDirty()方法有点困惑 从数据库中获取(非常大的)复杂对象后,NHibernate的ISession.IsDirty()直接给出“true”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_
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:我还应该提到以下方面:
如果您的某些实体是脏的,因此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"/>