مشكلة رسم خرائط ثنائية الاتجاه nhibernate
-
23-09-2019 - |
سؤال
أثناء محاولة إنشاء رسم خرائط ثنائي الاتجاه فرديًا في Nhibernate ، وجدت ذلك ، أنا غير قادر على الإشارة إلى الكائنات بشكل متكرر.
على سبيل المثال: افترض أن لدي علاقات فردية بين Person
و Address
.
ثم بعد تنفيذ الكود التالي ،
class Person
{
... ...
public Address Address { get;set; }
}
class Address
{
... ...
public Person Person {get;set;}
}
Repository<Person> rep = new Repository<Person>();
Person p = rep.Get<Person>(1);
أحتاج إلى عدم وجود غيرnull
القيمة من p.Address.Person
. أي نفس الشخص مع معرف 1.
لكن العقار يعود null
-القيمة.
ما الذي يجب أن أبحث عنه لحل المشكلة؟
جداول قاعدة البيانات الخاصة بي مثل هذا:
Address {ID, Desc}
Person {ID, Name, AddressID}
person.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
default-access="property"
>
<class name="NHibernate__BiDirectional__One_To_One.BO.Person, NHibernate__BiDirectional__One_To_One.BO"
table="Person">
<id name="ID">
<generator class="native" />
</id>
<property name="Name"/>
<many-to-one
name="Address"
class="NHibernate__BiDirectional__One_To_One.BO.Address, NHibernate__BiDirectional__One_To_One.BO"
column="AddressID"
cascade="all"
unique="true" />
</class>
</hibernate-mapping>
address.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
default-access="property"
>
<class name="NHibernate__BiDirectional__One_To_One.BO.Address, NHibernate__BiDirectional__One_To_One.BO"
table="Address">
<id name="ID" >
<generator class="native" />
</id>
<property name="Desc"/>
<one-to-one
name="Person"
class="NHibernate__BiDirectional__One_To_One.BO.Person, NHibernate__BiDirectional__One_To_One.BO"
/>
</class>
</hibernate-mapping>
أنا أيضا أتلقى خطأ:
could not load an entity: [NHibernate__BiDirectional__One_To_One.BO.Person#1][SQ
L: SELECT person0_.ID as ID0_1_, person0_.Name as Name0_1_, address1_.ID as ID1_
0_, address1_.Desc as Desc1_0_, address1_.AddressID as AddressID1_0_ FROM Person
person0_ left outer join Address address1_ on person0_.ID=address1_.AddressID W
HERE person0_.ID=?]
Incorrect syntax near the keyword 'Desc'.
المحلول
هناك نوعان من الجمعية الفردية:
• الجمعيات الرئيسية الرئيسية
• الجمعيات الرئيسية الخارجية الفريدة
لا تحتاج الجمعيات الرئيسية الأساسية إلى عمود جدول إضافي ؛ إذا تم ربط صفين من قبل الجمعية ، فإن صفين الجدول يشتركان في نفس قيمة المفتاح الأساسي. لذا ، إذا كنت تريد أن تكون كائنين مرتبطين من خلال الارتباط الرئيسي الأساسي ، فيجب عليك التأكد من تعيينهما نفس قيمة المعرف! بالنسبة للجمعية الرئيسية الأساسية ، أضف التعيينات التالية إلى الموظف والشخص ، على التوالي.
<one-to-one name="Person" class="Person"/>
<one-to-one name="Employee" class="Employee" constrained="true"/>
الآن يجب علينا التأكد من أن المفاتيح الأساسية للصفوف ذات الصلة في جداول الشخص والموظف متساوية.
نحن نستخدم استراتيجية توليد معرف Nhibernate خاصة تسمى الأجانب:
<class name="Person" table="PERSON">
<id name="Id" column="PERSON_ID">
<generator class="foreign">
<param name="property">Employee</param>
</generator>
</id>
...
<one-to-one name="Employee"
class="Employee"
constrained="true"/>
</class>
ثم يتم تعيين مثيل الشخص المحفوظ حديثًا نفس قيمة المفتاح الابتدائي مثل مثيل الموظف المشار إليه مع ممتلكات الموظف لهذا الشخص. بدلاً من ذلك ، يمكن التعبير عن مفتاح خارجي مع قيود فريدة من الموظف إلى شخص ما.
<many-to-one name="Person" class="Person" column="PERSON_ID" unique="true"/>
ويمكن جعل هذا الارتباط ثنائي الاتجاه عن طريق إضافة ما يلي إلى تعيين الشخص:
<one-to-one name="Employee" class="Employee" property-ref="Person"/>
الق نظرة على هذا
https://forum.hibernate.org/viewtopic.php؟p=2362617&sid=23c4df33b683409df9b5d844037d6d03