سؤال

يجب أن خريطة اثنين جدول بسيط مع مفتاح العلاقة.أحد الجداول الاتصال تحتوي الأعمدة معرف (المفتاح الأساسي من نوع int) ، اسم, عنوان و guid (المضافة حديثا وليس المفتاح الأساسي).والآخر هو الهاتف__عدد تحتوي الأعمدة معرف (المفتاح الأساسي من نوع int) ، الاتصال___معرف (المفتاح الخارجي من معرف في الاتصال الجدول) الهاتف__عدد.

ملف التعيين الاتصال الجدول أدناه :

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="OfflineDbSyncWithNHibernate" default-lazy="true" namespace="OfflineDbSyncWithNHibernate.Models">
  <class name="Contact" table="Contact">
    <id name="Id" column="Id" type="int">
      <generator class="native" />
    </id>

    <property name="Name" column="name" type="string"/>
    <property name="Address" column="address" type="string"/>
    <property name="Guid" column="guid" type="string"/>

    <set lazy="true" batch-size="6" table="phone_number" name="PhoneNumbers" fetch="join" inverse="false" cascade="all" >
      <key foreign-key="FK_contact_phone_number" column="contact_id"/>
      <one-to-many class="PhoneNumber" />
    </set>

  </class>
</hibernate-mapping>

ملف التعيين على Phone_number الجدول :

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="OfflineDbSyncWithNHibernate" default-lazy="true" namespace="OfflineDbSyncWithNHibernate.Models">
  <class name="PhoneNumber" table="phone_number">
    <id name="Id" column="Id" type="int">
      <generator class="native" />
    </id>
    <property name="ContactId" column="contact_id" />
    <property name="Number" column="phone_number" />
  </class>
</hibernate-mapping>

الاتصال و PhoneNumber فصول هي :

namespace OfflineDbSyncWithNHibernate.Models
{
    public class Contact
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual string Address { get; set; }
        public virtual string Guid { get; set; }
        public virtual PhoneNumbers PhoneNumbers { get; set; }
    }
}

namespace OfflineDbSyncWithNHibernate.Models
{
    public class PhoneNumber
    {
        public virtual int Id { get; set; }
        public virtual int ContactId { get; set; }
        public virtual string Number { get; set; }
    }
}

namespace OfflineDbSyncWithNHibernate.Models
{
    public class PhoneNumbers : List<PhoneNumber>
    {
    }
}

عندما كنت تحميل الاتصال و phone_numbers بشكل منفصل يعمل, ولكن بعد إضافة مجموعة عنصر للحصول على واحد لكثير العلاقة nhibernate يعطي خطأ :

NHibernate.MappingException:صالح الخرائط معلومات محددة عن نوع OfflineDbSyncWithNHibernate.نماذج.الاتصال, تحقق من ملف تعيين الخاصية نوع التطابق

أنا جديدة على nHibernate لذلك أنا لست متأكدا مما إذا كان هناك خطأ في تعيين عنصر أو لم يجب حتى يكون استخدامه.أي مساعدة سوف يكون موضع تقدير.

هل كانت مفيدة؟

المحلول

فقط نتذكر هذا

  • حقيبة تنفيذها باستخدام IList
  • مجموعة تنفيذها باستخدام ايست
  • قائمة تنفيذها باستخدام ArrayList أو قائمة
  • خريطة تنفيذها باستخدام HashedTable أو يقع

إذا كنت ترغب في استخدام IList استخدام القاعدة الأولى أنا.e تغيير الخاص بك hbm.xml استخدام حقيبة بدلا من تعيين أيضا مركز مدينة بوخارست نخالة الفئة يجب أن ترث من IList غير قائمة ، إذا كنت ترغب في استخدام القائمة سوف تحتاج إلى تغيير إعدادات ملف تعيين لاستخدام قائمة بدلا من تعيين.

نصائح أخرى

أعتقد أن مركز مدينة بوخارست نخالة بحاجة إلى الدرجة ترث من نوع فرعي من Iesi.Collections.ISet.لا أعتقد أن هناك "تعيين" نوع المنصوص عليها في .صافي بشكل افتراضي.انظر السبات أسئلة وأجوبة

على <set> خرائط إلى Iesi.مجموعات.ايست.أن واجهة هو جزء من Iesi.مجموعات الجمعية توزع مع NHibernate.

جمع الخاصة بك-يجب أن يكون نوع واجهة, لأن NHibernate سيوفر انها نوع خاص من أن تنفذ تلك الواجهة عندما كائن يتم استردادها من DB.

إذا قمت بتعريف المجموعة الخاصة بك كما

public virtual ISet<PhoneNumber> Phonenumbers = new HashedSet<Phonenumber>();

ثم أعتقد أنه سوف يعمل.

من أجل التحكم بشكل أفضل في الوصول إلى المجموعة الخاصة بك ، يمكنك تعديل جهات الاتصال الخاصة بك الطبقة مثل هذا:

public class Contact
{
    public virtual int Id {get;set;}
    ..

    private ISet<Phonenumber> _phoneNumbers = new HashedSet<PhoneNumber>();

    public ReadOnlyCollection<Phonenumber> PhoneNumbers
    {
        get 
        {
           return new List<Phonenumber>(_phoneNumbers).AsReadOnly();
        }
    }

    public void AddPhonenumber( Phonenumber n )  
    {
        n.Contact = this;
        _phoneNumbers.Add(n);
    }

    public void RemovePhoneNumber( PhoneNumber n )
    {
        ...
    }
}

ثم لديك للتأكد من أن في رسم الخرائط الخاصة بك من التواصل الدرجة ، يمكنك تحديد أن NHibernate الوصول إلى ميدان _phoneNumbers بدلا من الملكية PhoneNumber:

<set name="PhoneNumbers" access="field.camelcase-underscore" ... >
   ...
</set>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top