2

親テーブルと子テーブルがあり、エンティティは 1 対多のリレーションシップを使用して作成およびマップされます。Inverse() を使用すると、1 対多の側で、子テーブルの外部キー値が null として挿入されます。

public class TableA
{
   public virtual long ID { get; set; }
   public virtual string Name { get; set; }
   public virtual IList<TableB> TableB { get; set; }
}

public class TableB
{
   public virtual long ID { get; set; }
   public virtual string Name { get; set; }
   public virtual TableA TableA { get; set; }
}

public class TableAMap : ClassMap<TableA>
{
   public TableAMap()
   {
      Id(x=>x.ID);
      Map(x=>x.Name).Column("Name");
      HasMany(x=>x.TableB)
          .KeyColumn("TableA_ID")
          .Inverse()
          .Cascase.All()
          .Not.LazyLoad();
   }
}

public class TableBMap : ClassMap<TableB>
{
   public TableBMap()
   {
      Id(x=>x.ID);
      Map(x=>x.Name).Column("Name");
      References(x=>x.TableA).Column("TableA_ID").Not.LazyLoad();
   }
}

多からInverse()1 に削除すると、新しいレコードは問題なく挿入され、外部キーは問題なく挿入されますが、レコードを更新すると、既存のレコードの外部キーが null として置き換えられます。

同様の質問を調べましたが、役に立ちません。

外部キーをnullに設定する流暢なNHibernateの1対多の関係

4

2 に答える 2

3

この問題の解決策があるこのリンクを参照してください。

このソリューション リンクを参照してください

マップ クラスは次のようになります。

public class TableAMap : ClassMap<TableA>
{
   public TableAMap()
   {
      Id(x=>x.ID);
      Map(x=>x.Name).Column("Name");
      HasMany<TableB>(x=>x.TableB)
          .KeyColumn("TableA_ID")
          .Cascade.All().Inverse();
   }
}

public class TableBMap : ClassMap<TableB>
{
   public TableBMap()
   {
      Id(x=>x.ID);
      Map(x=>x.Name).Column("Name");
      References<TableA>(x=>x.TableA).Column("TableA_ID").Not.Nullable();
   }
}
于 2013-01-16T07:48:23.120 に答える
1

挿入するコードを見ずに正確に判断するのは困難です。しかし、私の水晶玉は、おそらく最後の行を忘れたと言っています

Parent parent = new Parent();
Child child = new Child();
parent.Children.Add(child);
child.Parent = parent;     <-- this is important because this will maintain the foreign key
于 2012-11-28T07:47:05.707 に答える