为什么NHibernate会更新DB中的旧实体,尽管没有分配id

时间:2013-04-09 06:25:09

标签: nhibernate fluent-nhibernate

我正在使用Fluent NHibernate和MS SQL Express 2012。

当我想将一些实体保存到DB时,我只需创建它们并调用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);
    }
}

以下是我将它们保存到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中有两个实体。然后我停止应用,更改value-field的值,然后重新开始(即创建一个新的SessionFactory)。在上面的代码之后,没有新的实体添加到DB。相反,旧的现在有另一个值字段值。

P.S。:我找不到MS SQL Server 2012的数据库驱动程序,所以我不得不使用MS SQL 2008的驱动程序。这可能是问题吗?

1 个答案:

答案 0 :(得分:0)

SchemaUpdate只创建不存在的表/列