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 用のドライバーを使用する必要がありました。それが問題なのでしょうか?