سؤال

أنا أعمل مع عدد قليل من إرث الجداول التي لها علاقات ، ولكن هذه العلاقات لم تكن صراحة تعيين كـ الأساسية/المفاتيح الخارجية.أنا خلقت .dbml الملف باستخدام "Linq To Sql Classes" وأنشأ الحالة الصحيحة.CaseID = CaseInfo.CaseID الجمعيات.بلدي نتيجة الصف CasesDataContext.

الجداول (واحد إلى كثير):

Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...


CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...

أنا جديدة على LinqToSQL و أواجه صعوبة في القيام..

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            where c.CaseInfo.CaseInfoMeta == "some value"
            select c;

(تحرير) مشكلتي أن CaseInfo أو CaseInfos لا يتوفر الأعضاء من الحالات.

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

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

المحلول

العودة إلى مصمم تحقق العلاقة إعداد بشكل صحيح.هنا هو واحد الحياة الحقيقية سبيل المثال ، مع BillStateMasters يكون "CustomerMasters1" الملكية (العملاء الدولة):alt text

Ps.تسمية يتم تنظيف ...

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

نصائح أخرى

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            join ci in db.CaseInfo on
            ci.ID equals c.InfoID
            where ci.CaseInfoMeta == "some value"
            select new {CASE=c, INFO=ci};

وبلدي "الانضمام" LINQ هو صدئ قليلا، ولكن ما سبق يجب الاقتراب من ما كنت بعد.

هل العلاقة المقرر أن احد إلى واحد أو واحدة لكثير؟ إذا كان لديك جمعية تعيين إلى واحد إلى كثير، ثم ما لديك هو EntitySet، وليس EntityRef وستحتاج إلى استخدام بند فيها على مجموعة يعتمد للحصول على القيمة الصحيحة. وأظن أن كنت تريد واحدة لعلاقة واحدة، وهي ليست الافتراضي. محاولة تغييرها إلى واحد على واحد ونرى ما اذا كان يمكنك بناء الاستعلام.

ملحوظة: أنا فقط التخمين لأنه لم تكن قد قال لنا في الواقع ما "ورطة" هو في الواقع

والاستعلام الخاص بك يبدو الصحيح ويجب أن تعود مجموعة نتائج الاستعلام من الأشياء القضية.

وهكذا ... ما هي المشكلة؟

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

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

وماذا تقصد ب "غير متوفرة"؟ إذا قمت بإنشاء الجمعيات في مصمم كما تقول فعلت، ثم الاستعلام يجب أن تولد SQL شيئا على غرار

SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
   ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'

هل تصحيحه الاستعلام LINQ الخاص بك للحصول على SQL التي تم إنشاؤها حتى الآن؟ ماذا يعود؟

وزوجين من الأشياء التي قد ترغب في محاولة:

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

ومنذ كنت لا تحصل على CaseInfo على C، حاول كتابتها الاتجاه الآخر لمعرفة ما إذا تحصل ci.Case مع التحسس.

وحذف وإعادة إنشاء جمعية معا.

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

إذا فشل كل شيء آخر، والتحول إلى NHibernate. :)

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

هل هذا ج #؟ أعتقد أنك بحاجة == بدلا من = على هذا الخط:

where c.CaseInfo.CaseInfoMeta = "some value"

ويجب قراءة

where c.CaseInfo.CaseInfoMeta == "some value"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top