سؤال

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

ومع ذلك، تم الإعلان عنها مؤخرا أن LINQ إلى SQL سيقوم بمقعد خلفي لإطار الكيان الآن بعد أن تم تمريره إلى فريق ADO.NET (http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx.). بالتأكيد، سيتم دعمه في المستقبل، لكن من غير المرجح أن يرى المزيد من الأعمال التطويرية.

مع وضع ذلك في الاعتبار، هل توصي لي باستخدام هذه التكنولوجيا لمشروعي أو هل يستحق تحديدها إما اختيار orm بديل (أحمق؟) أو ترميز دال عام يدويا؟

يعتمد المشروع نفسه على ASP.NET و SQL Server 2005/2008 وربما استخدام MVC، على الرغم من أنه لا يزال في بيتا. إنه مشروع شخصي، لن تكون قاعدة البيانات معقدة بشكل مفرط وسيتم استخدامها بشكل أساسي كنسخة أوابية للنظر في .NET Future Tech. سأكون على استيعاب المشاريع المستقبلية حول ما أتعلم منه من هذا الأمر، وبالتالي فإن الخيارات التي أجريها ستؤثر على حلول أكبر للحضور.

ونعم، أدرك أن Microsoft من المحتمل أن تبرز تقنية الوصول إلى البيانات الجديدة بالكامل غدا على أي حال! ؛)

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

المحلول

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

Linq إلى SQL (L2S) متعدد الاستخدامات للغاية، لكنه يشعر ب TAD بسيطة جدا من وجهة نظري. في معظم الحالات، تقوم بعمل جيد في القيام بأشياء بسيطة، ولكن بمجرد أن تسأل أكثر من ذلك قليلا، يصبح مكلفا. هذا ليس شيئا سيئا على الإطلاق. أعتقد فعلا LinQ إلى SQL فعلا تضمين إطار الكيان بشكل جيد.

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

سأكون أول من أعترف أن L2S لديها ميزة على إطار الكيان من حيث جودة T-SQL التي تم إنشاؤها (يجب أن تكون قد تم بناء L2S على وجه التحديد للاستعلام عن SQL Server) ومفاهيا ومباشرا، الكثير من LINQ إلى SQL يشبه EF، ولكن حيث تضغط على الحائط في توسيع الاحتياجات والنظر في متطلبات التنفيذ الأكثر تعقيدا.

إذا كنت سأبدأ من الصفر واختيار تكريس وقت التطوير الشخصي، سأختار إطار الكيان. من المثير للاهتمام بما فيه الكفاية، أنا أعمل في مشروع في الوقت الحالي الذي يستخدم L2s ويتم تصميمه لتوسيع نطاق الأحمال الثقيلة NAD، ولكن عندما تصل إلى بعض المتطلبات "الإبداعية"، فغالبا ما أجبرنا على التوسع على SQL Metal (على سبيل المثال العلاقات بين العديد من العلاقات).

لذلك .. باختصار .. كنت أقترب ذلك هكذا:

أ) تعلم LinQ إلى SQL كمقدم (أنماط وتكنولوجيا Microsoft في Microsoft) .. يجعلك على دراية بمعظم الأساسيات التي تتم مشاركتها مع إطار الكيان، وتذوق أسلوب LinQ Requerying (ذوق مكتسب إذا كان لديك خلفية في T-SQL)

ب) بمجرد حصولك على مقبض على LinQ إلى SQL، أوصي بالقفز إلى إطار الكيان لتعلم الفوائد الإضافية (ESQL ETC)

ج) تنفيذ دليل على مشروع مفهوم في كلا من النتائج ومقارنة النتائج.

نصائح أخرى

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

المنظمة البحرية الدولية، تم تفجير هذا الأمر كله بالفعل من النسبة.

لم تقل Microsoft أن LINQ إلى SQL ستكون ميتة. وأشاروا أكثر أن يتم دمجها في إطار كيان.

أركز على استخدام إطار الكيان كحل، مع العلم أن الكثير من LINQ إلى SQL سيتم توصيله فيه.

حقا ليس هناك الكثير من الاختلاف الآن على أي حال. أكبر شكوى هي أن إطار الكيان ليس خفيف الوزن. هل هذا مهم حقا طالما أن لديك فصل جيد بين مستوياتك؟

L2S هو، IMHO، جيد تماما الطريقة كما قلت، كما قلت، لا يذهب إلى أي مكان. جعلت الشركة التي أعملها من أجلها معيارا للوصول إلى البيانات ونحن نستخدمها لكل شيء من Little 5 User Niche Apps إلى 1000+ تطبيقات Enterprise User مع نتائج رائعة.

تحقق من الخلقية:

http://subsonicproject.com/

أعتقد أن أهداف edm. لدينا أكبر بكثير من تلك الخاصة ب LINQ إلى SQL. إذا كنت تبحث عن orm بسيط، فما أعتقد أن LinQ إلى SQL هو الطريق للذهاب. إذا كنت تخطط للبناء في الفصول الدراسية التي لها هيكل الميراث فيما يتعلق جداول قاعدة البيانات التي لها هيكل علائقية ويقوم بإجراء تعيينات متقدمة أخرى، فقد يكون EDM اختيارا جيدا.

تجدر الإشارة إلى أن هذا الموقع بنيت باستخدام LinQ إلى SQL. تحدث جيف عن استخدامه على بودكاست Stackoverflow.

L2S هي تقنية رهيبة، ولن أعود أبدا إلى ADO القديم.

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

كتبت منشورا على جعل المفتاح ومقارنة الأطرين: http://nappinski.net/post/getting-started-with-linq-to-entities.aspx.

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

يمكنني استخدام L2S بشدة على مشروع الويب الحالي الخاص بي وأعتقد أن أكبر شنق ستجد هو وثائق متضاربة فيما يتعلق بأفضل طريقة للقيام بتطوير قاعدة بيانات N-Tier.

أولا وقبل كل شيء ما تحتاجه لإدراك مقدما هو، وكائنات DataContext من المفترض أن تستمر فقط طالما وحدة العمل, ، فترة. بالإضافة إلى ذلك، DataContext هي عديمة الجنسية. بمجرد أن تأتي للسيطرة مع هذين الرئيسين، يبدأ استخدام LinQ في بيئة N-Tier في العمل بشكل جيد.

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

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

    public static void UpdateUser(UserLibrary.User user) {
        using (UserLibraryDataContext dc = new UserLibraryDataContext(_conStr))
        {
            UserLibrary.User newUser = (from user2 in dc.Users where user2.UserID == user.UserID select user2).FirstOrDefault();
            newUser.Email = user.Email;
            newUser.FirstName = user.FirstName;
            newUser.LastName = user.LastName;
            dc.SubmitChanges();
        }        

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

أود أن أوصي L2S، بمجرد أن تحصل على عدد قليل من القضايا الزينة (مثل ما سبق)، إنها تقنية رائعة ومثيرة بالتأكيد وقت التوقف. ومع ذلك، أود أن أوصي بعمل مجمع رقيق حول دال الخاص بك، حتى تتمكن من التغيير بسهولة. أنا أفكر (لأسباب اقتصادية) تقوم بتنفيذ جزء من التعليمات البرمجية الخاصة بي لاستخدام OpenAccess Orm -> MySQL للحصول على جزء من وصول بياناتي، ومع طبقة محددة بشكل صحيح، يجب أن تأخذني هذه المهمة إلا بضع ساعات.

وأنا أتفق مع echostorm. L2s جيد لاحتياجاتك. ومن السهل جدا العمل مع ...

إذا قمت بتصميم تطبيقك بشكل صحيح وعزل طبقة الوصول إلى البيانات جيدا، يجب أن تذهب مع L2s. من ما أستند إليه من مشاركتك، إنه ليس مشروعا كبيرا، لذلك يجب أن تفي L2S بمتطلباتك على ما يرام، في حين أن ADO.NET قديم عادي هو مجرد إطار رقم لا، والكيان، فقط لا تستخدمه ، نعم؟ على أي حال، إذا قمت بعزل دال الخاص بك جيدا، فيمكنك تبديل L2s إلى شيء آخر في المستقبل إذا نمو المشروع. وحتى إذا لم يكن L2S في أي مكان، فهذا لن يذهب إلى أي مكان. توقفت MS عن الاستثمار فيه، لكن لن يتم إهمالها أو شيء ما، لذلك لا يزال استثمارا آمنا. بدلا من ذلك، يجب عليك تقييم Nibernate، وهو بسيط وناضج.

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