1

(Fluent)NHibernate を使用してプリミティブ型コレクションを永続化するのに問題があります。

エンティティとマッピングは次のとおりです。

public class SomeOne
{
    public virtual long ID { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual Iesi.Collections.Generic.ISet<string> Foo { get; protected set; }

    public SomeOne()
    {
        Foo = new HashedSet<string>();
    }
}


    public SomeOneMap()
    {
        Id(x => x.ID).GeneratedBy.Identity();
        Map(x => x.Name);
        Map(x => x.Description);
        HasMany(x => x.Foo).Element("Code").AsSet().Not.Inverse();
        Table("SomeTypeOne");
    }

ただし、 SomeOne インスタンスを保存しようとすると、関連する Foo 文字列が無視されます。

        var session = factory.OpenSession();
        var one = new SomeOne();
        one.Foo.Add("Dato");
        one.Foo.Add("Mari");
        session.Save(one);

何が間違っている可能性がありますか?ありがとう

アップデート


これがdbスキーマです。NH によって生成されます。ここに画像の説明を入力

4

1 に答える 1

2

収集したデータを永続化するには、2 つの方法があります。

  1. session.Flush();の後に呼び出しsession.Save(one);ます。これにより、NHibernate はコレクションを永続化します。フラッシュの詳細については、こちらを参照してください。

  2. 全体をトランザクションにラップします。つまり、

    using (var session = factory.OpenSession())
    using (var transaction = session.BeginTransaction())
    {
      var one = new SomeOne();
      one.Foo.Add("Dato");
      one.Foo.Add("Mari");
      session.Save(one);
      transaction.Commit();
    }
    

オプション 2 がオプション 1 より優れている理由はいくつかあります。主な利点は、すべてのオブジェクトが同じトランザクション内で DB に保存されるため、1 つの挿入が失敗した場合、トランザクションがロールバックされ、DB が一貫性のない状態のままになることはありません。この質問に対する受け入れられた回答には、NHibernate でトランザクションを使用する必要がある理由についての広範な説明があります。

于 2013-03-19T22:03:21.310 に答える