NHibernate:Fluent 中的错误映射,导致检索所有查询完成时结果重复



简而言之:查询到"父项"表的结果"父项"+来自"子项"的记录。"孩子"对"父母"有FK,因此我在"孩子"中有尽可能多的FK的重复。我在MVC3项目中使用Fluent.NHibernate ASP.NET。

所以,DB看起来像这样

TABLE parents
***id
***system_name
TABLE children
***id
***custom_name
***parent_id
FK: parent_id === "FK_parent_id_to_id_in_parents"

型:

public class Parent
{
   public virtual int Id { get; set; }
   public virtual string SystemName { get; set; }
}
public class Child: Parent
{
   public override int Id
   {
      get
      {
             return base.Id;
       }
      set
      {
             base.Id = value;
      }
   }
   public virtual string CustomName
   {
      get
      {
             return _CustomName != null ? _CustomName : base.SystemName;
      }
     set
     {
            _CustomName = value;
     }
   }
    public virtual Parent ParentId { get; set; }
    private string _CustomName = string.Empty;
}

映射:

public class ParentMapper: ClassMap<Parent>
{
    Table("parents");
    Id(x => x.Id).GeneratedBy.Native();
    Map(x => x.SystemName, "system_name").Not.Nullable();
}
public class ChildMapper: ClassMap<Child>
{
    Table("children");
    Id(x => x.Id).GeneratedBy.Native();
    Map(x => x.DisplayName, "display_name");
    References(x => x.ParentId).Column("parent_id").Cascade.None().ForeignKey("FK_parent_id_to_id_in_parents");
}

查询:

using(ITransaction tr = session.BeginTransaction())
{
    List<Parent> lp = new List<Parent>(session.CreateCriteria(typeof(Parent)).List<Parent>());
    tr.Commit();
}

这对我来说似乎是不正确的,我不确定为什么您在子类中覆盖 Get Id。 你回来parent.id child.id吗?

 public override int Id
   {
      get
      {
             return base.Id;
       }
      set
      {
             base.Id = value;
      }
   }

肯定应该是吗?

public int id { get; set;}

如果您确实想要这样做,那么您还需要在子类中覆盖以下内容,以便 NHibernate 知道什么是唯一的子记录。

public override int GetHashCode() 
override bool Equals(object obj)

请参阅此处或此处以获取更多信息

最新更新