gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:50:45 26 4
gpt4 key购买 nike

使用 NHibernate.Mapping.Attributes,我有一个像这样的实体类:

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

[Property]
public string Property1 {...}
...
}

假设我使用如下代码将 transient 实体添加到持久性上下文:

...
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
...

我假设断言会成功,但实际结果是错误的。我的印象是 save 方法将使用生成的值更新实体的 Id 属性。我已经使用 NHibernate 1.2 和 2.0 对此进行了测试,结果相似。

那么问题是:

  • 这种行为(不更新实体的 ID)是设计使然,还是我在我的机器中错误地编译了 NHibernate?

最佳答案

你还没有指定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"属性。

关于c# - NHibernate ISession.save(newTransientEntity) 是否只会返回生成的 Id,但不会更新实体的 Id 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/411127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com