我有一个记录结构,我有一个包含许多子记录的父记录。在同一页面上,我会有几个问题让所有的孩子都来。
稍后查询我将在展开时获得记录集,显示“代理”。从记录中获取数据这一切都很好,因为一切都在那里。我遇到的唯一问题是,当我去抓取记录“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>();
}
答案 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();
}
}