كيف يمكنني الاستفادة من ORM لقاعدة بيانات مخططها غير معروف حتى وقت التشغيل؟

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

سؤال

أحاول الاستفادة من ORM بالنظر إلى المتطلبات التالية:

1) استخدام .NET Framework (أحدث إطار عمل جيد)
2) يجب أن يكون قادرًا على استخدام Sybase وOracle وMSSQL بالتبادل
3) المخطط ثابت في الغالب، ولكن هناك أجزاء ديناميكية.

أنا على دراية إلى حد ما بـ SubSonic وNHibernate، ولكن ليس بعمق.
ينتابني شعور مزعج بأن إدارة ORM يمكنها أن تفعل ما أريد، لكنني لا أعرف كيفية الاستفادة منه في الوقت الحالي.

ربما لا يكون SubSonic هو الحل الأمثل، نظرًا لأنه لا يدعم Sybase حاليًا، كما أن كتابة مزود خدمة خاص بي له يتجاوز مواردي وقدراتي في الوقت الحالي.

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

يوجد مخطط ثابت أساسي يتعامل معه ORM (NHibernate ATM) بشكل جيد.
لكن, ، يمكن للمورد إضافة جدول إلى قاعدة البيانات (فعليًا) طالما أنه يضيف البيانات أيضًا إلى جداول البيانات التعريفية لوصف بنيتها.

ما أريده حقًا هو أن أكون قادرًا بطريقة أو بأخرى على "تغذية" ORM بهذه البيانات الوصفية (بطريقة يفهمها) وجعلها تسمح لي في تلك المرحلة بالتعامل مع البيانات.

بلدي الابتدائي هدف هو تقليل كمية بناء عبارات SQL العامة التي يجب أن أقوم بها على هذه الجداول الديناميكية.
أود أيضًا تجنب القلق بشأن الاختلافات في SQL التي يتم إرسالها إلى Sybase أو Oracle أو MSSQL.

بلدي الابتدائي مشكلة هو أنه ليس لدي طريقة لإعلام ORM بالجداول الديناميكية حتى وقت التشغيل، عندما أتمكن من الوصول إلى البيانات التعريفية

يحرر:مثال على الاستخدام قد يكون مثل ذلك المبينة هنا:

IDataReader rdr=new Query("DynamicTable1").WHERE("ArbitraryId",2).ExecuteReader();

(ومع ذلك، لا يبدو أن SubSonic سيعمل، حيث لا يوجد موفر Sybase (انظر أعلاه)

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

المحلول

Acording لهذه بلوق يمكنك في الواقع استخدامها NHibernate مع رسم الخرائط الديناميكية.على الرغم من أن الأمر يتطلب بعض التغيير والتبديل ...

نصائح أخرى

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

استخدم نظامنا مشروعًا مفتوح المصدر لإنشاء SQL (لا تتذكر الاسم بعد الآن) وقمنا ببناء جميع استعلاماتنا بلغة Xml الخاصة بنا (لغة ترميز الاستعلام - QML).يمكننا بعد ذلك إنشاء مستند xml مع التحديدات والأماكن والمجموعات وما إلى ذلك.ثم أرسل ذلك إلى SqlEngine الذي سيحوله إلى عبارة Sql وينفذه.نحن نناقش ذاكرة التخزين المؤقت في كل هذا، ولكننا لم ننفذها أبدًا.وهذا من شأنه أن يسمح لنا بتخزين ملفات Qmls مؤقتًا للاستعلامات المستخدمة بشكل متكرر.

أنا في حيرة من أمري بشأن كيفية استخدام orm في وقت التشغيل؟إذا كان ORM سيبني شيئًا ما ديناميكيًا في وقت التشغيل، فكيف يعرف رمز وقت التشغيل ما فعله Orm ديناميكيًا؟

"اسمح لي عند هذه النقطة بمعالجة البيانات" - ما هو التعامل مع البيانات؟

ربما أفتقد شيئًا هنا وأعتذر إذا كان هذا هو الحال.(لقد استخدمت بالفعل النهج من الأسفل إلى الأعلى مع ORM)

لا يقوم IDataReader بتعيين أي شيء لكائن تعرفه.لذلك يجب كتابة المثال الخاص بك باستخدام منشئ الاستعلام الكلاسيكي.

هل فكرت في استخدام ADO.NET Entity Framework؟

شبكة MSDN:LINQ للكيانات

فهو يسمح لك بتعيين جداول قاعدة البيانات إلى نموذج كائن بطريقة يمكنك من خلالها البرمجة دون التفكير في بائع قاعدة البيانات الذي يتم استخدامه، ودون القلق بشأن الاختلافات الطفيفة التي أجراها مسؤول قواعد البيانات (DBA) على الجداول الفعلية.يتم الاحتفاظ بالتعيين في ملفات التكوين التي يمكن تعديلها عند تعديل جداول قاعدة البيانات دون الحاجة إلى إعادة الترجمة.

أيضًا، باستخدام LINQ to Entities، يمكنك إنشاء استعلامات بطريقة OO، بحيث لا تكتب سلاسل استعلام SQL فعلية.

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