我正在使用 Fluent NHibernate 和 MS SQL Express 2012。
当我想将一些实体保存到数据库时,我只需创建它们并调用 ISession.Save() 或 ISession.SaveOrUpdate() 而不设置它们的 id 字段。一切正常,直到我停止应用程序并重新启动它。之后,新实体不会添加到 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);
}
}
这是我将它们保存到数据库的方法:
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();
}
}
之后,数据库中有两个实体。然后我停止应用程序,更改值字段的值,然后重新开始(即创建一个新的 SessionFactory)。在上面的代码之后,没有新的实体被添加到数据库中。相反,旧的现在有另一个值字段值。
PS:我找不到 MS SQL Server 2012 的 db 驱动程序,所以我不得不使用 MS SQL 2008 的驱动程序。这可能是问题吗?