رسم خرائط Nhibernate فردي حيث يمكن أن تكون بيانات الجدول الثاني لاغية

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

القيد هو أن هناك بدلاً من الزناد على جدول المعاملات لا يسمح بتحديثات المعاملات الملغاة أو المنشورة.

لذلك ، عندما يتم حساب التسلسل ويتم حفظ المعاملة ، يحاول nhibernate إرسال تحديث على المعاملة مثل "تحديث المعاملة المعاملة المعاملة =؟ أين المعاملة =؟ '. لكن هذا فشل بسبب الزناد. كيف يمكنني تكوين التعيين الخاص بي حتى لا يحاول nhibernate تحديث جدول المعاملات عند إدراج جدول معاملة جديد؟

رسم خرائط المعاملات:

<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true">
    <id name="Id" column="ID">
        <generator class="native" />
    </id>

    <property name="TransactionTypeId" access="field.camelcase-underscore" />
    <property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" />

    <one-to-one name="Sequence" class="TransactionSequence" fetch="join"
                 lazy="false" constrained="false">      
    </one-to-one>
</class>

ورسم خرائط التسلسل:

<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true">
    <id name="TransactionId" column="TransactionID" type="Int32">
        <generator class="foreign">
            <param name="property">Transaction</param>
        </generator>
    </id>

    <version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" />

    <property name="SequenceNumber" not-null="true" />

    <one-to-one name="Transaction" 
                class="Transaction" 
                constrained="true" 
                foreign-key="fk_Transaction_Sequence" />

</class>

أي مساعدة سيكون موضع تقدير كبير ...

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

المحلول

واحد إلى واحد الخرائط في nhibernate لا تعمل بالطريقة التي تعتقد أنها تفعل. تم تصميمه بحيث يكون لديك فئتان ، والتي عندما تستمر في الجداول المقابلة لها نفس المفاتيح الأساسية.

ومع ذلك يمكنك أن تجعلها تعمل ، لكنها ليست جميلة. سأريكم كيف أعرض بعض البدائل:

في معاملتك HBML:

<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/>

في تسلسلك HTML:

<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" />

هذه ينبغي افعل ما تريد أن تفعله. لاحظ الممتلكات-REF.

السؤال التالي الذي ستنشره هو أن تسأل كيف تحصل على تحميل كسول على جمعيات فردية. الجواب هو ، لا يمكنك ... حسنًا ، لكن من المحتمل ألا ينجح. المشكلة هي أن لديك المفتاح الخارجي الخاص بك على جدول التسلسل ، مما يعني أن Nhibernate يجب أن يضرب قاعدة البيانات لمعرفة ما إذا كان الهدف موجودًا. بعد ذلك ، يمكنك محاولة اللعب باستخدام "True/False" لمعرفة ما إذا كان يمكنك إقناعه بتحميل الجمعية الواحدة.

الكل في الكل ، سيؤدي ذلك إلى مضيعة كاملة لوقتك.

أقترح إما:

  1. لديك اثنين من الجمعيات كثيرة.
  2. لديك ارتباط كثير إلى واحد مع مجموعة على الطرف الآخر.

سيوفر لك هذا الكثير من الصداع على المدى الطويل.

نصائح أخرى

تبين أن ذلك بالنسبة لموقفي أ <join table> رسم الخرائط العمل بشكل أفضل. كان علي فقط أن أتأكد من أنني صنعت الخصائص التي جاءت من الجدول الثاني كانت أنواعًا قابلة للإلغاء ، أو أنها ستقوم بإدراج على الحفظ حتى لو لم يتغير شيء. بما أنني لم أكن بحاجة إلى تحميل كسول للجدول الثاني ، فهذا يعمل بشكل رائع. أنا متأكد من أنه كان من الممكن أن أحصل على العديد من التعيينات إلى العمل ، لكنها لم تكن بديهية ويبدو أكثر تعقيدًا من خيار جدول الانضمام <join table> متوفر فقط في Nhibernate 2.0 وما فوق.

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