Stimmt es, dass NHibernate ISession.save (newTransientEntity) nur Id erzeugt zurück, aber nicht die ID-Eigenschaft des Unternehmens zu aktualisieren?

StackOverflow https://stackoverflow.com/questions/411127

Frage

NHibernate.Mapping.Attributes verwenden, ich habe eine Entity-Klasse mit so etwas wie:

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

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

Lassen Sie sagen, wenn ich eine vorübergehende Einheit der Persistenzkontext mit Code wie folgt hinzu:

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

Ich nehme an, dass die Assertion Erfolg sein wird, aber das tatsächliche Ergebnis ist falsch. Ich habe den Eindruck, dass das Verfahren spart die Id-Eigenschaft des Unternehmens mit dem erzeugten Wert aktualisieren. Ich habe dies getestet, indem sowohl NHibernate 1.2 und 2.0 mit ähnlichen belegt wird.

Die Frage ist also:

  • Ist dieses Verhalten von Entwurf (nicht die Entität der Id Aktualisierung), oder ich habe falsche Zusammenstellung von NHibernate in meinem Rechner?
War es hilfreich?

Lösung

Sie haben nicht den Namen des Id angegeben

Statt:

[Id]

sollten Sie den Namen angeben:

[Id(Name="Id")]

Im ersten Fall die erzeugte Abbildung ist falsch:

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

, während im zweiten Fall erhalten Sie die korrekte Zuordnung erhalten:

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

Beachten Sie die name = "Id" Attribut, das fehlt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top