为什么NHibernate在没有分配id的情况下更新数据库中的旧实体
我使用的是Fluent NHibernate和MS SQL Express 2012 当我想将一些实体保存到DB时,我只需创建它们并调用ISession.save()或ISession.SaveOrUpdate(),而不设置它们的id字段。一切正常,直到我停止应用程序并重新启动它。之后,新实体不会添加到数据库中。相反,当我调用Save()或SaveOrUpdate()时,它只更新旧的 为什么NHibernate会这样做?在我看来,当我不设置id字段时,它必须向DB添加一个新实体,但不能更新旧实体 下面是一个例子: 假设我们有一个Foo类:为什么NHibernate在没有分配id的情况下更新数据库中的旧实体,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我使用的是Fluent NHibernate和MS SQL Express 2012 当我想将一些实体保存到DB时,我只需创建它们并调用ISession.save()或ISession.SaveOrUpdate(),而不设置它们的id字段。一切正常,直到我停止应用程序并重新启动它。之后,新实体不会添加到数据库中。相反,当我调用Save()或SaveOrUpdate()时,它只更新旧的 为什么NHibernate会这样做?在我看来,当我不设置id字段时,它必须向DB添加一个新实体,但不能更新旧实体
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);
}
}
之后,数据库中有两个实体。然后,我停止应用程序,更改value字段的值,然后重新启动它(即装入新的SessionFactory)。在上述代码之后,没有新的实体添加到数据库中。相反,旧的字段现在有另一个值字段值
备注:我找不到适用于MS SQL Server 2012的db驱动程序,所以我必须使用适用于MS SQL 2008的驱动程序。可能是问题吗?有一个
SchemaUpdate
只创建了不存在的表/列在创建SessionFactory时,您是否使用SchemaExport或其他工具删除或截断db/表?是否使用LocalDB并将修改后的db替换为空db?是的,我使用SchemaExport,但不用于删除db/表。仅创建一个DB结构。就在SchemaExport和数据库中的数据和结构保持不变之后,我在断点上停止了。请在var sf=config.BuildSessionFactory()之后尝试断点谢谢,米卡!你是对的。表似乎被删除,然后重新创建。那我现在该怎么办?有没有一种方法可以在不丢失表格的情况下调用ShemaExport?
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();
}
}