سؤال

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

ولقد واجهت مشكلة حيث I سحب DTO من مستودع (مثل CustomerDTO) ومن ثم تحويله إلى كائن المجال (العملاء) في طبقة خدمتي. وبعد ذلك محاولة لحفظ كائن جديد إلى الخلف (مثل أمر البيع) والذي يحتوي على نفس الكائن العملاء. وبدوره تحويل هذا إلى SalesOrderDTO (وCustomerDTO) للدفع في المخزون.

وNHibernate لا يحب هذا- أنه يشكو من أن CustomerDTO هو سجل مكررة. أفترض أن هذا هو لأنه أخرج أول CustomerDTO في الدورة نفسها، ولأن عودته تم تحويلها ذهابا وإيابا أنه لا يمكن التعرف على هذا النحو نفس الكائن.

وأنا عالقة هنا أو هناك طريقة للتغلب على هذه؟

والشكر

وجيمس

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

المحلول

ويمكنك إعادة إرفاق كائن إلى جلسة في NHibernate باستخدام قفل - منها مثلا

_session.Lock(myDetachedObject, NHibernate.LockMode.None);

والتي قد تكون أو لا تساعد اعتمادا على بالضبط ما يحدث هنا. على الجانب علما، وذلك باستخدام وDTO مع NHibernate ليس الممارسة الأكثر شيوعا، والحقيقة أن NHibernate (في الغالب) يدعم استمرار الجهل يعني أن عادة لا تستخدم على نطاق واسع في DTO كما هو الحال مع بعض الأطر ORM أخرى.

نصائح أخرى

وانها حقا حول كيفية عمل جلسة NHibernate. حتى إذا كنت في جلسة سحب مثيل CustomerDTO الخاصة بك ومن ثم بعد فترة من الوقت يجب أن تحصل على نفس CustomerDTO (مثلا عن طريق المفتاح الأساسي) - هل فعلا سوف تحصل إشارة إلى نفس الكائن كما فعلت في استرجاع الأول

وهكذا ما تفعله هو أنك إما دمج الكائنات عن طريق الاتصال session.Merge أو تسأل جلسة العمل الخاصة بك لكائن من خلال الدعوة session.Get (أساسي) القيام التحديثات الخاصة بك وتدفق الدورة.

ولكن على النحو الذي اقترحه ستيف - هذه ليست عادة ما تفعله - كنت تريد حقا للحصول على كائن المجال الخاص بك من مخزن البيانات واستخدام DTOs (عند الحاجة) لنقل البيانات إلى واجهة المستخدم، خدمة ويب أيا كان ...

وكما ذكر آخرون، يساوي تنفيذ وGetHashCode هو خطوة في الاتجاه الصحيح. ننظر أيضا إلى دعم NHibernate من اجل "إرفاق" OR / M لغة.

لديك أيضا خيار nosetter.camelcase تحت تصرفكم: <لأ href = "http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be- تعديل / "يختلط =" نوفولو noreferrer "> http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/

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

وعلى سبيل المثال، أنا أعمل حاليا على التطبيق سطح المكتب التجاري حيث واحد من كائنات المجال الخاص بي قد بياناتها انتشرت بين قاعدة بيانات وملفات الصور SQL CE على القرص. للأسف NHibernate يستطيع مساعدتي فقط مع استمرار SQL CE. أنا اضطرت الى استخدام نوع من "رسم الخرائط مزدوج" (انظر "أنماط مارتن فاولر من تطبيق المشاريع المعمارية ") تعيين نموذج نطاقي من خلال طبقة المستودع الذي يعرف ما يذهب البيانات إلى NHibernate وما إلى القرص.

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

<اقتباس فقرة>   

وأفترض أن هذا هو لأنه   انسحبت أول CustomerDTO في   الدورة نفسها، ولأن   العودة تم تحويلها مرة أخرى و   وما لا يمكن التعرف على هذا النحو   نفس الكائن.

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

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