NHibernate未插入Guid ID为的实体

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;

我正在尝试使用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; 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); ... } }