سؤال

NHibernate مستجد هنا.هل تبحث عن نصيحة حول كيفية رسم خريطة للسيناريو الشائع التالي:

[محل]
معرف pk
اسم

[بند الأوراق المالية]
معرف pk
اسم

[StockItemStore]
معرف PK
StockItemId fk
معرف المتجر fk
ParLevel

لقد قمت بإنشاء نموذج مجال يسمح بتعيين عناصر StockItems المختلفة إلى متاجر مختلفة عبر StockItem Entity باستخدام طريقة AssignToStore (متجر المتجر).

أنا الآن أستخدم nhibernate لإنشاء مخطط قاعدة البيانات الخاص بي.كيف أقوم بإعداد ملفات التعيين لهذا السيناريو الأساسي؟

أي نصائح موضع تقدير كبير.

تشيف

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

المحلول

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

أسلوبي في ذلك هو إعداده كتعيينين متعدد لواحد مع العلاقة التالية في تعيين المتجر والعلاقة العكسية في تعيين StockItem.

<bag name="StockItems" table="StockItemStore" lazy="true">
  <key column="StoreId" />
  <composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components">
    <property name="ParLevel" type="Int32" />
    <many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" />
  </composite-element>
</bag>

ستحتوي فئة المتجر على المجموعة التالية:

public virtual IList< StockItemStore > StockItems {get;set;}

وسيحصل StockItem على العكس مرة أخرى:

public virtual IList< StockItemStore > Stores {get;set;}

كائن StockItemStore قادر على احتواء أي من الكائنين (Store أو StockItem) وأي معلومات إضافية موجودة في جدول الارتباط.(في هذه الحالة فقط ParLevel.

اعتمادًا على الجانب الذي تنظر فيه إلى كائن StockItemStore من المتجر أو StockItem سيكون فارغًا.يمكن تقسيمها إلى فئتين، لكني أجد هذا النهج أسهل في العمل به.يتطلب الأمر منك فقط كمطور معرفة الجانب الذي تتعامل معه، ولكنها مقايضة جيدة لجعل الكود أبسط وأكثر قابلية لإعادة الاستخدام في رأيي

public class StockItemStore
{
    private StockItem stockItem;
    private Store store;

    public virtual StockItem StockItem
    {
        get
        {
            if (stockItem == null)
            {
                stockItem = new StockItem();
            }

            return stockItem;
        }
        set
        {
            stockItem = value;
        }
    }

    public virtual Store store
    {
        get
        {
            if (store == null)
            {
                store = new Store();
            }

            return store;
        }
        set
        {
            store = value;
        }
    }

    public virtual int ParLevel { get; set; }

}

لا يستخدم الأسلوب الذي أتبعه معرفًا فريدًا واحدًا في StockItemStore كما حددته في سؤالك، بل ما يرقى إلى مستوى المفتاح المركب في جدول الارتباط.لكنها خدمتني جيدًا في الماضي بشكل عام.أنا متأكد من أنه يمكنك استخدام هذا المعرف بطريقة ما إذا كنت في حاجة إليه حقًا.

يعمل هذا الأسلوب بشكل رائع للاستعلام باستخدام HQL.إذا كنت تحاول استخدام استعلامات ICriteria، فإنها تميل إلى أن تصبح متزعزعة بعض الشيء.هناك بعض الحلول المتاحة لاستخدام طرق عرض قاعدة البيانات لمحاكاة جدول آخر لاستخدامه في الاستعلام والتي نجحت معي.

إذا كنت بحاجة إلى إجراء استعلامات ICriteria، فأخبرني بذلك ويمكنني نشر بعض نماذج التعليمات البرمجية.

  • الأعلى

نصائح أخرى

أوصي بشدة بالقراءة على nHibernate.إليك نقطة انطلاق جيدة جدًا:

الأسئلة الشائعة حول nHibernate

أود أيضًا أن أوصي بإجراء التعيينات يدويًا في أول مرتين.بعد ذلك، يجب عليك التحقق من Fluent nHibernate.يمكن لـ Fluent nHibernate (من بين أشياء أخرى) إنشاء التعيينات تلقائيًا لك من نموذج المجال الخاص بك ومساعدتك أيضًا في إنشاء مخطط قاعدة البيانات.إنها أداة مرنة للغاية تتحسن باستمرار.ستجده هنا:

السبات بطلاقة

حظ سعيد!

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