Stimmt es, dass NHibernate ISession.save (newTransientEntity) nur Id erzeugt zurück, aber nicht die ID-Eigenschaft des Unternehmens zu aktualisieren?
-
03-07-2019 - |
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?
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.