كيفية التحكم في قيم المفتاح الأساسي عند زرع البيانات باستخدام كود Entity Framework أولاً

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

سؤال

أقوم بإنشاء موقع asp.net mvc4 باستخدام إطار عمل الكيان 5 مع codefirst وsql server Express 2012.

لقد قمت بتمكين عمليات الترحيل والآن أفعل ذلك في طريقة Configuration.Seed الخاصة بي:(لاحظ أنني أريد تعيين المفتاح الأساسي على 8 على الرغم من أن هذا هو السجل الأول في قاعدة البيانات).

context.ProductCategoryDtoes.AddOrUpdate(x => x.Id,
    new ProductCategoryDto() { Id = 8, Name = "category1" }
);

يتم تعريف كائن النموذج الخاص بي على النحو التالي:

[Table("ProductCategory")]
public class ProductCategoryDto {
    public long Id { get; set; }
    public string Name { get; set; }
}

ينتج عن هذا جدول في (SQL SERVER EXPRESS 2012) حيث يحتوي عمود المعرف على الهوية = صحيح، وبذرة الهوية = 1، وزيادة الهوية = 1.

الآن عندما أقوم بتشغيل عمليات الترحيل عن طريق القيام بـ PM> Update-Database هذه النتيجة في صف مع معرف = 1.

لذلك سؤالي هو:

1) كيف يمكنني التحكم في قيم المفاتيح الأساسية المتزايدة تلقائيًا عند زرع البيانات.

2) إذا كان الحل هو زيادة القيمة الأساسية للأعمدة الرئيسية، فكيف يمكن القيام بذلك عندما أستخدم Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());.سيؤدي هذا إلى تدمير قاعدة البيانات وإعادة بنائها في كل مرة أقوم فيها بتحديث قاعدة البيانات، فكيف سيتم تحديث القيمة الأولية في قاعدة البيانات الجديدة؟

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

المحلول

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

نصائح أخرى

هل حاولت إضافة هذا أعلى خاصية المعرف الخاص بك:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }

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

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

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

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

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

Context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ProductCategoryDto ON " +
     "INSERT INTO dbo.ProductCategoryDto (Id, Name) VALUES (8, 'category1') " +
     "SET IDENTITY_INSERT dbo.ProductCategoryDto OFF");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top