NHibernate ISession.save(newTransientEntity)は生成されたIdのみを返しますが、エンティティのIdプロパティを更新しないのは本当ですか?
-
03-07-2019 - |
質問
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
...
アサートは成功すると思いますが、実際の結果は偽です。 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>
2番目のケースでは、正しいマッピングが取得されます:
<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 =&quot; Id&quot;に注意してください。欠落していた属性。
所属していません StackOverflow