سؤال

أنا أتلاعب بـ LinqToSQL باستخدام قاعدة بيانات موجودة متعددة اللغات، ولكني أواجه مشكلات في تعيين علاقة رأس برأس مهمة إلى حد ما، لذلك أظن أنني أستخدم الميزة بشكل غير صحيح لتصميم قاعدة البيانات الخاصة بي.

افترض جدولين، الفئة وتفاصيل الفئة.تحتوي الفئة على معرف الفئة (PK) ومعرف الوالدين ومعرف القالب.يحتوي CategoryDetail على معرف الفئة (FK)، ومعرف اللغة، والعنوان، والوصف (باللغة المناسبة)، مع PK مدمج لمعرف الفئة ومعرف اللغة.

إذا قمت بسحب هذه الجداول وإفلاتها في مصمم LinqToSQL، فإن نموذج الكائن الناتج يحتوي على فئة مع مجموعة من كائنات CategoryDetail، وهو ما لا ينبغي أن يكون هو الحال أبدًا.أود أن أكون قادرًا على التصفية على LanguageId على مستوى DataContext، مما يعني أن الفئة بأكملها مغلفة ضمن Category.CategoryDetail، وليس كل إصدار اللغة مغلف ضمن Category.CategoryDetails.

عملت قاعدة البيانات هذه بشكل جيد على مكتبة الكائنات القديمة الخاصة بي (BOL وDAL المخصصين للمدرسة القديمة)، لكنني أخشى أن LinqToSQL سيتطلب تغيير هذا من أجل إعطائي النتيجة المطلوبة.

ما هي أفضل طريقة لجعل هذه العلاقة (وتصفية اللغة) سلسة قدر الإمكان؟

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

المحلول

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

نصائح أخرى

يجب أن أفترض أنه لا يمكن أن يكون صحيحًا 1 إلى 1.يبدو أن لديك PK لـ CatID وLang ID في جدول تفاصيل Cat.وهذا من شأنه أن يفسر سبب وضع مجموعة.قد أكون مخطئًا لأنك لم تذكر PK في جدول CatDetails

يحرر:إن الجمع بين Pk لـ CatID وLang ID يجعل العلاقة 1:m، ويقوم Linq إلى SQL بالفعل بالشيء الصحيح.الطريقة الوحيدة التي يمكن أن تكون 1:1 حقيقية هي إذا كان لديك معرف لغة على طاولة القطط أيضًا وكان ذلك جزءًا من FK.أعتقد أنه قد يتعين عليك إعادة التفكير فيما تريد القيام به، أو كيف تريد تنفيذه.

أعتقد أن LINQ to SQL يصمم بنية قاعدة البيانات مباشرة.لديك جدولين لذلك تقوم بإنشاء كائنين.

هل ألقيت نظرة على LINQ to Entities، فهذا يسمح لك بإنشاء طبقة أخرى فوق بنية قاعدة البيانات لإنشاء فئات أكثر قابلية للقراءة.

وبما أنه ليس لديك علاقة 1:1، فإن التعيين وحده لن يوفر الوظيفة المطلوبة.ومع ذلك، فمن السهل توفير طريقة في الفصل الأصلي الذي تم إنشاؤه تلقائيًا للقيام بهذه المهمة:

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top