3

Fluent NHibernate で HasOne マッピングを利用するのに非常に苦労しています。基本的に、クラス A はクラス B に一致する (1 つだけまたはまったくない) レコードを持つことができます。

リレーションシップを定義する AMap クラスと BMap クラスを手伝ってください。

ありがとうございました。

public class A
{
   public virtual int Id {get;set;}
   public virtual string P1 {get;set;}
   public virtual string P2 {get;set;}
   public virtual string P3 {get;set;}
}

public class B
{
   public virtual int Id {get;set;}
   public virtual string P4 {get;set;}
   public virtual string P5 {get;set;}
   public virtual string P6 {get;set;}
}
4

1 に答える 1

8

マッピングを機能させるには、以下のコードに従って、タイプのプロパティをクラスone-to-oneに追加する必要があります。NHibernate は一方向の 1 対 1 をサポートしていないため、これらの参照は両方のクラスで必要です。BA

public class A
{
  public virtual int Id {get;set;}
  public virtual string P1 {get;set;}
  public virtual string P2 {get;set;}
  public virtual string P3 {get;set;}
  public virtual B child { get; set; }
}

public class B
{
  public virtual int Id {get;set;}
  public virtual string P4 {get;set;}
  public virtual string P5 {get;set;}
  public virtual string P6 {get;set;}
  public virtual A parent;
}

次に、流暢なマッピングで、次を追加する必要があります

public AMap()
{
  /* mapping for id and properties here */
  HasOne(x => x.child)
      .Cascade.All();
}

public BMap()
{
  /* mapping for id and properties here */
  References(x => x.parent)
      .Unique();
}

の 1 対多のマッピングBMapは としてマークされていることに注意してくださいUnique。これは、NHibernate を使用して DB スキーマを生成する場合に、一意の列制約を作成するために使用されます。

新しいレコードを作成するには、次のように記述します。

    using (var transaction = session.BeginTransaction())
    {
        var classA = new A();
        classA.child = new B() { parent = classA};

        session.Save(owner);
        transaction.Commit();
    }

最後に、NHibernate の現在のリリースである 3.4 は、孤立した 1 対 1 のカスケード削除をサポートしていません。バグレポートについては、こちらを参照してください。これは、次のように記述した場合session.Delete(classA);、関連するクラス B レコードが自動的に削除されないことを意味します。

于 2013-03-31T00:39:10.833 に答える