丢失记录ID

时间:2013-03-20 22:00:41

标签: fluent-nhibernate

我有一个记录结构,我有一个包含许多子记录的父记录。在同一页面上,我会有几个问题让所有的孩子都来。

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

我可以使用evict强制它有时加载。然而,当我需要延迟加载(For Grids)时,evict很糟糕,因为它杀死了懒惰的负载,我无法动态显示网格内容。

我正在使用以下内容开始我的会话:

ISession session = FluentSessionManager.SessionFactory.OpenSession();
session.BeginTransaction();
CurrentSessionContext.Bind(session);

我甚至在我的查询中使用“.SetFetchMode(”MyTable“,Eager)”它仍然显示“代理”。

代理很好,但我需要记录ID。其他人遇到这个问题并进行简单的修复?

我非常感谢你的帮助。

感谢。

根据请求,这是我正在运行的查询,这将导致Patients.Children的ID为“0”,因为它显示为“代理”:

    public IList<Patients> GetAllPatients()
    {
        return FluentSessionManager.GetSession()
            .CreateCriteria<Patients>()
            .Add(Expression.Eq("IsDeleted", false))
            .SetFetchMode("Children", Eager)
            .List<Patients>();
    }

1 个答案:

答案 0 :(得分:0)

我找到了解决代理问题的银弹,你丢失了你的记录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:

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
}

IDomainBase:

public interface IDomainBase<Y>
{
    Y ID { get; set; }
}

域名映射:

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

        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();
    }
}