كيان Ado.net: لا يعرض الكائن الأعضاء المرتبطين (مفاتيح أجنبية)

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

سؤال

لدي قاعدة بيانات بسيطة: المستخدم، الحساب. يحتوي المستخدم على علاقة من 1 إلى العديدة مع الحساب.

لقد قمت بإنشاء نموذج بيانات كيان ADO.NET، ويمكنني إنشاء مستخدمين وحسابات، وحتى ربطهم معا. في قاعدة البيانات، يتم ملء الحساب. يتم ملء الحساب بشكل صحيح بشكل صحيح، من الناحية النظرية، يجب أن أكون قادرا على الوصول إلى user.account.tolist () في C # عبر كيان.

ومع ذلك، عندما أحاول أن يؤكد user.account.tolist () أحصل على نتائج صفرية.

User user = db.User.First(U => U.id == 1);
List<Account> accounts = user.Account.ToList(); ##count = 0...

عندما أضيف التعليمات البرمجية التالية قبل الرمز السابق، يعطيني فجأة العد الصحيح 2.

 Account account1 = db.Account.First(A => A.id == 1);
 Account account2 = db.Account.First(A => A.id == 2);
 User user = db.User.First(U => U.id == 1);
 List<Account> accounts = user.Account.ToList(); ##count = 2...??

ما أنا في عداد المفقودين هنا؟

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

المحلول

يجب عليك استخدام objectquery.include. طريقة لهذا. تعمل طريقتك أيضا ولكن تؤدي إلى استفسار إضافي.

في مثالك سوف تحصل عليه

User user = db.User.Include("Account").First(u => u.id == 1);

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

نصائح أخرى

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

على سبيل المثال

    if(!user.Account.IsLoaded)
        user.Account.Load();

يمكنك جعل هذا أسهل مع طريقة تمديد بسيط:

public static class EntityExtensions
{
    public static void EnsureLoaded(this RelatedEnd relatedEnd)
    {
        if (!relatedEnd.IsLoaded)
            relatedEnd.Load();
    }
}

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

user.Account.EnsureLoaded();

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

account.UserReference.EnsureLoaded();

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

أعتقد أن معرفتي صغيرة بعض الشيء من الإطار. :)

تحتاج إلى تحميل الحسابات ذات الصلة صراحة أولا.

user.Account.Load();

الآن يعرض بشكل صحيح.

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