سؤال

في تصميمات قاعدة البيانات الخاصة بي، أميل إلى الحصول على "مجموعات" من الجداول.ستدعم هذه المجموعات عادةً تطبيقًا واحدًا أو مجموعة من التطبيقات المرتبطة وظيفيًا بشكل وثيق.وفي كثير من الأحيان، ترتبط هذه المجموعات أيضًا ببعضها البعض من خلال عدد صغير نسبيًا من المفاتيح الخارجية؛وهذا يساعد التطبيقات المستقلة في الأعمال على التكامل مع بعضها البعض.

لذلك، على سبيل المثال:تخيل أن لدي تطبيقات "Foo" و"Bar" و"Baz"، مع وجود عدة جداول لكل منها.فيما يلي قائمة بالجداول ومراجع المفاتيح الخارجية الخاصة بها:

  • فوتابلي وان
  • فوتابليتو -> فوتوتابليون
  • بارتابلوان -> فووتابليتو
  • بارتابليتو -> بارتابليوني
  • BazTableOne
  • بازتابليتو -> فوتابليتو، بازتابليوان

أستخدم حاليًا LINQ-to-SQL للوصول إلى هذه الجداول.لدي مشروع منفصل لكل مجموعة (Foo، وBar، وBaz)، ولكل من هذه المشاريع ملف dbml. لجميع الجداول الموجودة في المجموعة.الفكرة هنا هي أن كل تطبيق (واحد أو أكثر) يستخدم المجموعة يمكنه استيراد مكتبة مشتركة تحتوي على فئات LINQ التي يحتاجها.

قد تكون هذه فكرة جيدة وقد لا تكون كذلك؛يبدو مثل هيئة المحلفين يكون ما زال خارج.ما أتساءل عنه حقًا هو ما إذا كان بإمكاني الحصول على المراجع بين المجموعات التي تعبر عنها الفئات الموجودة في مجموعة أخرى أم لا، على الرغم من وجودها في فئة سياق مختلفة.(وبشكل أكثر تحديدًا، كيفية إنشاء هذه العلاقة في Visual Studio).

وبالعودة إلى المثال، أود أن يكون لدي:

  • مشروع فو
    • فو.dbml
    • FooDataContext
    • فوتابلي وان
      • FooTableOne.FooTableTwos
    • فوتبليتو
      • FooTableTwo.FooTableOne
      • FooTableTwo.BarTableOnes (هذا ليس بنفس الأهمية)
      • FooTableTwo.BazTableTwos (هذا ليس بنفس الأهمية)
  • شريط المشروع
    • Bar.dbml
    • BarDataContext
    • BarTableOne
      • BarTableOne.FooTableTwo
      • BarTableOne.BarTableTwos
    • BarTableTwo
      • BarTableTwo.BarTableOne
  • مشروع الباز
    • Baz.dbml
    • BazDataContext
    • BazTableOne
      • BazTableOne.BazTableTwos
    • BazTableTwo
      • BazTableTwo.FooTableTwo
      • BazTableTwo.BazTableOne

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

لاحظ أنه مع هذا الفصل بين السياقات/المجموعات، أحصل على نمطية بين التطبيقات.لذلك، على سبيل المثال، سيتعين على تطبيق Baz فقط استيراد سياقات Baz وFoo (نظرًا لأن Baz يعتمد على Foo)، وليس Bar.(يفترض هذا أنني لا أملك مجموعات كيانات Bar في Foo، وهذا أمر جيد بالنسبة لي).وهذا شيء جميل، لكنه ليس حاسما:إذا لم يجعل LINQ/VS هذا الأمر سهلاً، فسأفكر في إلغاء النمطية والذهاب إلى سياق واحد كبير.

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

المحلول

لا يمكن لـ L2S أن تصمم العلاقات عبر ملفات DBML.المنظمة البحرية الدولية (IMO)، يعد هذا عيبًا كبيرًا في L2S.لقد كافحت مع هذا في طلبنا.لدينا جميع الكيانات في ملفات DBML منفصلة.يمثل كل ملف DBML مساحة اسم في تطبيقنا، ومخططًا في قاعدة بيانات SQL Server الخاصة بنا.

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

راندي

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