0

Fluent NHibernate と MS SQL Express 2012 を使用しています。

いくつかのエンティティを DB に保存したいときは、エンティティを作成して ID フィールドを設定せずに ISession.Save() または ISession.SaveOrUpdate() を呼び出すだけです。アプリケーションを停止して再起動するまで、すべて正常に動作します。その後、新しいエンティティは db に追加されません。代わりに、Save() または SaveOrUpdate() を呼び出すと、古いものだけが更新されます。

NHibernate がこのように動作するのはなぜですか? id フィールドを設定しない場合、DB に新しいエンティティを追加する必要がありますが、古いエンティティを更新する必要はないようです。

次に例を示します。

クラス Foo があるとします。

public class Foo
{
    public virtual long id { get; set; }
    public virtual string value { get; set; }
}

およびそのマッピング:

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Id(foo => foo.id)
            .GeneratedBy.Native();

        Map(foo => foo.value);
    }
}

これらをDBに保存する方法は次のとおりです。

var foo1 = new Foo { value = "aaa" };
var foo2 = new Foo { value = "bbb" };

var sf = config.BuildSessionFactory();
using (var sess = sf.OpenSession())
{
    using (var tr = sess.BeginTransaction())
    {
        sess.Save(foo1);
        sess.Save(foo2);

        tr.Commit();
    }
}

その後、DB には 2 つのエンティティがあります。次に、アプリケーションを停止し、値フィールドの値を変更して、最初からやり直します (つまり、新しい SessionFactory を作成します)。上記のコードの後、新しいエンティティは DB に追加されません。代わりに、古いものは別の値フィールド値を持つようになりました。

PS: MS SQL Server 2012 用の db ドライバーが見つからなかったので、MS SQL 2008 用のドライバーを使用する必要がありました。それが問題なのでしょうか?

4

1 に答える 1

0

SchemaUpdateまだ存在しないテーブル/列のみを作成するものがあります

于 2013-04-09T06:53:38.013 に答える