هل صحيح أن NHibernate ISession.save(newTransientEntity) سيعيد المعرف الذي تم إنشاؤه فقط، ولكن لن يقوم بتحديث خاصية المعرف للكيان؟

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

سؤال

باستخدام 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
...

أفترض أن التأكيد سيكون ناجحا، ولكن النتيجة الفعلية خاطئة.لدي انطباع بأن طريقة الحفظ ستقوم بتحديث خاصية معرف الكيان بالقيمة التي تم إنشاؤها.لقد اختبرت ذلك باستخدام كل من NHibernate 1.2 و 2.0 بنتيجة مماثلة.

لذا فإن السؤال هو:

  • هل هذا السلوك (عدم تحديث معرف الكيان) حسب التصميم، أم أن لدي تجميعًا خاطئًا لـ NHibernate في جهازي؟
هل كانت مفيدة؟

المحلول

لم تقم بتحديد اسم المعرف

بدلاً من:

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

لاحظ سمة الاسم = "المعرف" التي كانت مفقودة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top