1

これは非常に明白な質問のように思えますが、明確な答えを見つけることができませんでした。DefaultCascade.All()規則でFluentNHibernate自動マッピングを使用しています。

エンティティは節約していますが、1対多の関係では、コレクションに追加して節約しているにもかかわらず、多面的に片側を提供する必要があります。例はおそらくこれをよりよく説明するでしょう:

次の2つのクラスがあるとしましょう。

public class Owner
{
    public virtual IList<PetDog> Dogs { get; set; }
}

public class PetDog
{
    public virtual Owner Owner { get; set; }
}

飼い主の犬のコレクションに新しいPetDogを追加するには、電話をかけることができるはずです。

Owner.Dogs.Add(new PetDog());

ISessionを破棄します。しかし、私は所有者を保存しているだけで、それだけです。明示的に設定した場合

Owner.Dogs.Add(new PetDog { Owner = Owner })

できます。

その値を明示的に提供することを回避する方法はありますか?

4

1 に答える 1

0

これは、Ownerマッピングでinverse = falseを設定することにより、Ownerクラスを関係の所有者としてマークすることで実行できます。

HasMany(x => x.Dogs)
    .Not.Inverse()
    .Cascade.AllDeleteOrphan();

次に、PetDogテーブルのowner_id外部キーがコミット時に入力されます。

using (var transaction = session.BeginTransaction())
{
    var order = new Owner() {Dogs = new List<PetDog>()};
    order.Dogs.Add(new PetDog() );
    order.Dogs.Add(new PetDog() );

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

または、トランザクションを使用する代わりに、代わりに呼び出すことができますsession.Flush()。これにより、新しいデータがDBに挿入されます。

    var order = new Owner() {Dogs = new List<PetDog>()};
    order.Dogs.Add(new PetDog() );
    order.Dogs.Add(new PetDog() );

    session.Save(order);
    session.Flush(); // data persisted to DBMS here.

session.Flush()の使用は推奨されないベストプラクティスであることに注意してください。明示的なトランザクションを使用することをお勧めします。詳細については、 AyendeRahienによるこのブログ投稿を参照してください。

于 2013-03-25T19:22:59.887 に答える