سؤال

هذا هو متابعة في وقت سابق من السؤال لقد نشر على EF4 الكيان مفاتيح مع SQL Compact.SQL Compact لا تسمح server-إنشاء هوية المفاتيح, لذلك أنا تركت مع خلق بلدي مفاتيح الكائنات إضافة إلى ObjectContext.أول خيار أن يكون عدد صحيح مفتاح الإجابة السابقة مرتبطة بلوق وظيفة هذا يدل على امتداد الأسلوب الذي يستخدم Max مشغل محدد التعبير إلى العثور على المفتاح التالية متوفرة:

public static TResult NextId<TSource, TResult>(this ObjectSet<TSource> table,  Expression<Func<TSource, TResult>> selector) 
    where TSource : class
{
    TResult lastId = table.Any() ? table.Max(selector) : default(TResult);

    if (lastId is int)
    {
        lastId = (TResult)(object)(((int)(object)lastId) + 1);
    }

    return lastId;
}

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

عند هذه النقطة, الحل واضح يبدو ببساطة استخدام GUID ككيان الرئيسية.بهذه الطريقة, أنا فقط بحاجة إلى استدعاء Guid.NewGuid() طريقة لتعيين هوية المنشأة قبل أن تضيف كيان جديد بلدي ObjectContext.

هنا هو السؤال:هناك طريقة بسيطة للحصول على آخر مفتاح أساسي في مخزن البيانات من EF4 (دون الحاجة إلى إنشاء ثانية ObjectContext لهذا الغرض)?أي سبب آخر لا تأخذ الطريق السهل و ببساطة استخدام GUID?شكرا على مساعدتك.

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

المحلول

لقد ذهبت مع GUID.

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

  • على الأقل في هذه المرحلة ، يبدو أن هناك طريقة حول "أي server-إنشاء مفاتيح" الحد من SQL Compact/EF4 المكدس.إذا كان شخص ما لديه ذكي الإختراق, أنا لا تزال مفتوحة إلى ذلك.

هذا لا يعني أنني سوف تتخذ نفس النهج في SQL Server أو SQL server Express.لا يزال لدي يفضل صحيح مفاتيح SQL Compact أكبر الأشقاء تسمح لهم بالتعاون مع EF4.

نصائح أخرى

استخدم GUID. لا يتم دعم Autoincrement على إطار عمل مضغوط مع إطار الكيان.

أيضًا ، إذا كنت ترغب في إنشاء تطبيق يستخدم مصادر بيانات متعددة ، فسوف تنهار INT PK الخاص بك بسرعة كبيرة.

  • مع GUID's ، يمكنك مزج الاتصال Guid.NewGuid () للحصول على مفتاح جديد.
  • مع INT ، يجب عليك الوصول إلى قاعدة البيانات للحصول على مفتاح صالح.

إذا قمت بتخزين البيانات في قواعد بيانات متعددة ، فإن Int PK سوف يتسبب في تعارضات.

ما قمت به من أجل SQL CE من قبل ، وأفترض أن لدينا تطبيقًا واحدًا يصل إلى قاعدة البيانات ، هو حساب القيمة الأقصى عند بدء التشغيل ووضعها في متغير ثابت. يمكنك الآن توزيع القيم المتسلسلة بسهولة ويمكنك عمل الكود لإنشاء مؤشر ترابطها الآمن بسهولة بالغة.

أحد أسباب تجنب GUIDS هو الحجم = استهلاك مساحة التخزين.

يمكنك أيضًا الاستعلام عن بيانات التعريف المدمجة SQL مثل ذلك:

حدد autoinc_next من information_schema.columns حيث table_name = 'الفئات' و autoinc_next ليست فارغة

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