سؤال

يمكن لشخص يرجى توضيح أدناه لي. أولا هو كيفية استدعاء الطريقة والقليل الثاني هي طريقة LINQ.

سيقق فضولي من حقيقة أنني أحصل على context خطأ إذا قمت بالتعليق using جزء.

لماذا ا؟ يبدو أنني لا أفهم تماما using و context's. وبعد وأود أن أفهم هذا بشكل أفضل.

Guid workerID = new Guid(new ConnectDAL.DAL.Security().GetUserIDByUserLogin(HUD.CurrentUser));

        var myMembers = BLLCmo.GetAllMembers(workerID);
        if (myMembers.Rows.Count != 0)
        {
            dgvMyMembers.DataSource = myMembers;
        }
        else
        {
            var allMembers = BLLCmo.GetAllMembers();
            dgvMyMembers.DataSource = allMembers;
        }




    internal static CmoDataContext context = new CmoDataContext();

    public static DataTable GetAllMembers()
    {
        DataTable dataTable;

        //using (context)
        //{
            var AllEnrollees = from enrollment in context.tblCMOEnrollments
                               select new
                                       {
                                           enrollment.ADRCReferralID,
                                           enrollment.ClientID,
                                           enrollment.CMONurseID,
                                           enrollment.CMOSocialWorkerID,
                                           enrollment.DisenrollmentDate,
                                           enrollment.DisenrollmentReasonID,
                                           enrollment.EconomicSupportWorkerID,
                                           enrollment.EnrollmentDate
                                       };

            dataTable = AllEnrollees.CopyLinqToDataTable();
        //}
        return dataTable;
    }
هل كانت مفيدة؟

المحلول

"استخدام" كتل تتخلص تلقائيا من الكائن الذي تستخدمه. نظرا لأنك لم تمنح مزيدا من التفاصيل حول الخطأ الدقيق، فأنا أراهن أن "استخدام" سوف تتخلص من "سياقك"، ثم ستحاول لاحقا استخدام سياقك مرة أخرى.

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

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

//Our context exists right now ... unless we've already called this method since the app started ;)
var myMembers = BLLCmo.GetAllMembers(workerID); // Context is disposed at the end of this call
if (myMembers.Rows.Count != 0)
{
  dgvMyMembers.DataSource = myMembers;  //No prob, we didn't call our function again
}
else
{
  var allMembers = BLLCmo.GetAllMembers();  // Oops, our context was disposed of earlier
  dgvMyMembers.DataSource = allMembers;
}

نصائح أخرى

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

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

تحقق من وثائق IDisposable و using.

إليك رابط لمقال قد يساعدك إدارة مدى الحياة ل DataContext.

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

على سبيل المثال: تطلب فاتورة إلى DataContext الخاص بك، ولكن لاحقا تريد الوصول إلى اسم العميل، كما هو الحال في الفاتورة. لم يتم تحميل العميل، لذلك الاسم غير متوفر.

DataLoadOptions هي أيضا مهمة أيضا للأداء، إذا كنت بحاجة إلى هذا الكيان المرتبط في حلقة، فستعود إلى DB عدة مرات كما تحليمها إذا لم تقم بتحميل كيان الطفل (أو الوالد) مسبقا.

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