Entity Framework - كيف يمكنني إنشاء كائن "الكيانات" الخاص بي

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

سؤال

أنا مبتدئ تمامًا في Entity Framework وASP.Net MVC، وقد تعلمت في الغالب من البرامج التعليمية، دون أن يكون لدي فهم عميق لأي منهما.(لدي خبرة في استخدام .Net 2.0 وADO.Net وWebForms)

شكوكي الحالية تأتي من الطريقة التي أقوم بها بتمثيل كائنات الكيانات الخاصة بي.

أنا أفعل هذا بشكل أساسي في وحدات التحكم الخاصة بي:

public class PostsController : Controller {

    private NorthWindEntities db = new NorthWindEntities();

    public ActionResult Index() {
            // Use the db object here, never explicitly Close/Dispose it
    }
}

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

using (NorthWindEntities db = new NorthWindEntities() {
}

في كل طريقة تحتاج إلى اتصال، وإذا استدعت هذه الطريقة الآخرين الذين سيحتاجون إليها، فسوف تمرر لهم db كمعلمة.هذه هي الطريقة التي كنت أفعل بها كل شيء مع كائنات الاتصال الخاصة بي قبل وجود Linq-to-SQL.

الشيء الآخر الذي يجعلني أشعر بعدم الارتياح هو أن NorthWindEntities تطبق IDisposable، وهو ما يعني أنه يجب علي أن أتصل بطريقة Dispose() الخاصة بها، وأنا لست كذلك.

ما رأيك بهذا؟
هل من الصحيح مثيل كائن الكيانات كما أفعل؟هل يجب أن تعتني باتصالاتها عن طريق فتحها وإغلاقها لكل استعلام؟
أم يجب أن أتخلص منه بشكل صريح باستخدام جملة use()؟

شكرًا!

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

المحلول

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

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

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

وعلى النقيض من ذلك، إذا كنت تهيئة ObjectContext عندما تتم تهيئة وحدة تحكم (أو كتابة التعليمات البرمجية التهيئة كسول الامر الذي ادى ليتم تهيئتها عند تشغيل العمل) والتخلص من ObjectContext في Controller.Dispose، ثم سياق سيظل حول عندما يتم تقديم العرض. في هذه الحالة، وأنها آمنة لتمرير IQueryable إلى طريقة العرض. سيتم التخلص المراقب بعد فترة وجيزة يتم تقديم العرض.

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

نصائح أخرى

أنت تجعل نقطة جيدة هنا. كم من الوقت يجب أن يعيش ObjectContext؟ جميع كتب الأنماط والممارسات (مثل كتاب دينو إسبوزيتو تطبيقات مايكروسوفت-نت-الهندسة المعمارية) أخبرك أن DataContext يجب ألا يعيش لفترة طويلة، ولا يجب تخزينه مؤقتًا.

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

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