Fluent nhibernate 丢失记录ID

Fluent nhibernate 丢失记录ID,fluent-nhibernate,Fluent Nhibernate,我有一个记录结构,其中我有一个父记录和许多子记录。在同一页上,我将有几个查询来获取所有的孩子 在以后的查询中,当我展开记录集时,它会显示“Proxy”。这是从记录中获取数据的好方法,因为所有的东西都在那里。我唯一的问题是,当我去抓取记录“ID”时,它总是“0”,因为它是代理。这使得我在构建一个下拉列表时非常困难,我使用记录ID作为“所选值”。更糟糕的是它是随机的。因此,在5项列表中,其中2项的ID为“0”,因为它们是代理 我可以使用逐出来强制它有时加载。但是,当我需要惰性负载(对于网格)时,逐出

我有一个记录结构,其中我有一个父记录和许多子记录。在同一页上,我将有几个查询来获取所有的孩子

在以后的查询中,当我展开记录集时,它会显示“Proxy”。这是从记录中获取数据的好方法,因为所有的东西都在那里。我唯一的问题是,当我去抓取记录“ID”时,它总是“0”,因为它是代理。这使得我在构建一个下拉列表时非常困难,我使用记录ID作为“所选值”。更糟糕的是它是随机的。因此,在5项列表中,其中2项的ID为“0”,因为它们是代理

我可以使用逐出来强制它有时加载。但是,当我需要惰性负载(对于网格)时,逐出是不好的,因为它会杀死惰性负载,并且我无法动态显示网格内容

我正在使用以下命令开始我的会话:

ISession session = FluentSessionManager.SessionFactory.OpenSession();
session.BeginTransaction();
CurrentSessionContext.Bind(session);
我甚至在我的查询中使用“.SetFetchMode”(“MyTable”,Eager)”,它仍然显示“Proxy”

代理很好,但我需要记录ID。还有其他人遇到这个问题并有简单的解决方案吗

我将非常感谢您在这方面的帮助

谢谢

根据请求,以下是我正在运行的查询,该查询将导致患者。儿童ID为“0”,因为它显示为“代理”:

public IList GetAllPatients()
{
return FluentSessionManager.GetSession()
.CreateCriteria()
.Add(表达式.Eq(“IsDeleted”,false))
.SetFetchMode(“子项”,急切)
.List();
}

我找到了解决代理问题的灵丹妙药,因为您丢失了记录id! 我正在使用ClearCache解决这个问题。这对于记录结构中的前几层来说效果很好。但是,当您遇到Parient.Child.AnotherLevel.OneMoreLevel.DownOneMore场景时,将无法修复第4级和第5级。我想出的这个方法确实有用。我还发现,当我使用一对多,然后是多对一的映射时,它大部分都会出现。因此,这里是其他所有遇到同样问题的人的答案

域结构:

public class Parent : DomainBase<int>
{
    public virtual int ID { get { return base.ID2; } set { base.ID2 = value; } }

    public virtual string Name { get; set; }
    ....
}
公共类父类:DomainBase
{
公共虚拟int ID{get{return base.ID2;}set{base.ID2=value;}
公共虚拟字符串名称{get;set;}
....
}
域名库:

public abstract class DomainBase<Y>, IDomainBase<Y>
{
    public virtual Y ID //Everything has an identity Key.
    {
        get;
        set;
    }

    protected internal virtual Y ID2 // Real identity Key
    {
        get
        {
            Y myID = this.ID;
            if (typeof(Y).ToString() == "System.Int32")
            {
                if (int.Parse(this.ID.ToString()) == 0)
                {
                    myID = ReadOnlyID;
                }
            }

            return myID;
        }
        set
        {
            this.ID = value;
            this.ReadOnlyID = value;
        }
    }
    protected internal virtual Y ReadOnlyID { get; set; } // Real identity Key
}
public interface IDomainBase<Y>
{
    Y ID { get; set; }
}
公共抽象类DomainBase,IDomainBase
{
公共虚拟Y ID//所有内容都有一个标识密钥。
{
得到;
设置
}
受保护的内部虚拟Y ID2//真实身份密钥
{
得到
{
Y myID=this.ID;
if(typeof(Y).ToString()=“System.Int32”)
{
if(int.Parse(this.ID.ToString())==0)
{
myID=ReadOnlyID;
}
}
返回myID;
}
设置
{
this.ID=值;
this.ReadOnlyID=值;
}
}
受保护的内部虚拟Y ReadOnlyID{get;set;}//真实标识密钥
}
IDomainBase:

public abstract class DomainBase<Y>, IDomainBase<Y>
{
    public virtual Y ID //Everything has an identity Key.
    {
        get;
        set;
    }

    protected internal virtual Y ID2 // Real identity Key
    {
        get
        {
            Y myID = this.ID;
            if (typeof(Y).ToString() == "System.Int32")
            {
                if (int.Parse(this.ID.ToString()) == 0)
                {
                    myID = ReadOnlyID;
                }
            }

            return myID;
        }
        set
        {
            this.ID = value;
            this.ReadOnlyID = value;
        }
    }
    protected internal virtual Y ReadOnlyID { get; set; } // Real identity Key
}
public interface IDomainBase<Y>
{
    Y ID { get; set; }
}
公共接口IDomainBase
{
Y ID{get;set;}
}
域映射:

public class ParentMap : ClassMap<Parent, int>
{
    public ParentMap()
    {
        Schema("dbo");
        Table("Parent");

        Id(x => x.ID);

        Map(x => x.Name);
        ....
    }
}
公共类父映射:类映射
{
公共ParentMap()
{
模式(“dbo”);
表(“母公司”);
Id(x=>x.Id);
Map(x=>x.Name);
....
}
}
类映射:

public class ClassMap<TEntityType, TIdType> : FluentNHibernate.Mapping.ClassMap<TEntityType> where TEntityType : DomainBase<TIdType>
{
    public ClassMap()
    {
        Id(x => x.ID, "ID");
        Map(x => x.ReadOnlyID, "ID").ReadOnly();
    }
}
公共类类映射:FluentNHibernate.Mapping.ClassMap其中TEntityType:DomainBase
{
公共类映射()
{
Id(x=>x.Id,“Id”);
Map(x=>x.ReadOnlyID,“ID”).ReadOnly();
}
}

您是否也可以将第一段中提到的所有代码粘贴到这里?我添加了我正在使用的查询,该查询将给我ID为0的子项,因为记录是“代理”。请注意,并非所有记录都是“代理”。有点断断续续。