0

簡単に言うと、「parents」テーブルの結果「parents」+「children」からのレコードにクエリを実行します。「子供」は「親」に対してFKを持っているので、私は「子供」のFKの数と同じくらい多くの重複を持っています。ASP.NETMVC3プロジェクトでFluent.NHibernateを使用しています。

したがって、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();
}
4

1 に答える 1

0

これは私には正しくないようで、なぜあなたがあなたの子供のクラスでGetIdを過剰に使用しているのかわかりません。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)

詳細については、こちらまたはこちらをご覧ください

于 2012-05-05T09:35:35.673 に答える