C# NHibernate ISession.save(newTransientEntity)是否只返回生成的Id,而不更新实体的Id属性?

C# NHibernate ISession.save(newTransientEntity)是否只返回生成的Id,而不更新实体的Id属性?,c#,nhibernate,attributes,nhibernate-mapping,C#,Nhibernate,Attributes,Nhibernate Mapping,使用NHibernate.Mapping.Attributes,我有一个实体类,类似于: [Class] public class EntityA { ... [Id][Generator(class="guid")] public Guid Id {...} [Property] public string Property1 {...} ... } 假设我使用如下代码向持久性上下文添加一个临时实体: ... Guid id; using(ISession

使用NHibernate.Mapping.Attributes,我有一个实体类,类似于:

[Class]    
public class EntityA
{
  ...
  [Id][Generator(class="guid")]
  public Guid Id {...}

  [Property]
  public string Property1 {...}
  ...
}
假设我使用如下代码向持久性上下文添加一个临时实体:

...
Guid id;
using(ISession s = sessionFactory.OpenSession())
using(ITransaction t = s.BeginTransaction())
{
  EntityA entity = new EntityA();
  entity.Property1 = "Some Value";
  id = (Guid) s.Save(entity);
  t.Commit();
  Assert.IsTrue(s.Contains(entity)); // <-- result: true
}


Assert.AreEquals(id, entity.Id); // <-- Result: false, Expexted: true
...
。。。
Guid id;
使用(ISession s=sessionFactory.OpenSession())
使用(ITransaction t=s.BeginTransaction())
{
EntityA实体=新的EntityA();
entity.Property1=“某些值”;
id=(Guid)s.Save(实体);
t、 提交();

Assert.IsTrue(s.Contains(entity));//您尚未指定Id的名称

而不是:

[Id]
您应该指定名称:

[Id(Name="Id")]
在第一种情况下,生成的映射是错误的:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Test.EntityA, test">
    <id type="Guid">
      <generator class="guid" />
    </id>
  </class>
</hibernate-mapping>

在第二种情况下,您将获得正确的映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Test.EntityA, test">
    <id type="Guid" name="Id">
      <generator class="guid" />
    </id>
  </class>
</hibernate-mapping>


请注意缺少的name=“Id”属性。

谢谢,它可以工作!我太依赖序列化程序根据IdAttribute应用到的属性推断Id名称。再次感谢。