2

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

assert は成功すると思いますが、実際の結果は false です。save メソッドが生成された値でエンティティの Id プロパティを更新するという印象があります。NHibernate 1.2 と 2.0 の両方を使用してこれをテストしましたが、同様の結果が得られました。

質問は次のとおりです。

  • この動作 (エンティティの ID を更新しない) は設計によるものですか、それともマシンで NHibernate のコンパイルが間違っていますか?
4

1 に答える 1

3

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="Id" 属性に注意してください。

于 2009-01-04T17:04:53.600 に答える