NHibernate未插入Guid ID为的实体
我正在尝试使用Fluent NHibernate自动映射的NHibernate(版本2.1.0.4000) 我的实体测试集使用默认整数ID保持良好 我现在正在尝试对实体使用Guid ID。不幸的是,将Id属性更改为Guid似乎会阻止NHibernate插入对象 以下是实体类:NHibernate未插入Guid ID为的实体,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在尝试使用Fluent NHibernate自动映射的NHibernate(版本2.1.0.4000) 我的实体测试集使用默认整数ID保持良好 我现在正在尝试对实体使用Guid ID。不幸的是,将Id属性更改为Guid似乎会阻止NHibernate插入对象 以下是实体类: public class User { public virtual int Id { get; private set; } public virtual string FirstName { get;
public class User
{
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Email { get; set; }
public virtual string Password { get; set; }
public virtual List<UserGroup> Groups { get; set; }
}
这就是它无声地失败的地方,没有抛出异常或进一步的日志条目
看起来它正在为新对象正确地生成Guid ID,但只是没有得到更多
为了使用Guid ID,我需要做些不同的事情吗
谢谢
丹。我不完全确定自动映射的情况 但是,我可以告诉您的一件事是,在构建类的新实例时,请确保将它们的Guid设置为Guid.Empty,而不是Guid.NewGuid()。这向NHibernate发出信号,表示对象是新的,应该插入而不是更新;与int属性的零非常相似。NHibernate将在插入时将属性反向更新为生成的Guid public class Cat { public Cat() : base() { this.Id = Guid.Empty; } public virtual Guid Id { get; set; } ... } 公猫 { 公猫 :base() { this.Id=Guid.Empty; } 公共虚拟Guid Id{get;set;} ... } 在手动映射情况下,映射如下所示: public class CatMap : ClassMap { public CatMap() : base() { this.Id(e => e.Id); ... } } 公共类CatMap:ClassMap { 公共CatMap() :base() { this.Id(e=>e.Id); ... } }
您应该检查应用程序(非映射)代码,并确保您正在提交NHibernate
ITransaction
实例
使用整数ID和
本机
或标识
生成器时,NHibernate必须立即插入新实例,以便生成ID值(即使事务尚未提交)。当使用不依赖数据库生成ID的标识符策略(如guid.comb
)时,NHibernate在提交封闭事务之前不会实际执行插入。解决了这个问题!我根本没有在代码中使用Transaction.Begin()和Transaction.Commit(),使用整数ID,一切正常。在代码周围添加事务也可以使其与guid一起工作。非常感谢,丹。
16:50:14.008 [4] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener - saving transient instance
16:50:14.012 [4] DEBUG NHibernate.Event.Default.AbstractSaveEventListener - generated identifier: d74e1bd3-1c01-46c8-996c-9d370115780d, using strategy: NHibernate.Id.GuidCombGenerator
16:50:14.013 [4] DEBUG NHibernate.Event.Default.AbstractSaveEventListener - saving [TestEntities.User#d74e1bd3-1c01-46c8-996c-9d370115780d]
public class Cat
{
public Cat()
: base()
{
this.Id = Guid.Empty;
}
public virtual Guid Id { get; set; }
...
}
public class CatMap : ClassMap
{
public CatMap()
: base()
{
this.Id(e => e.Id);
...
}
}