رمز إطار عمل الكيان أولاً - لا يمكن إدراج مفتاح مكرر في الكائن "dbo.T_CRProviders"
-
12-12-2019 - |
سؤال
لدي مشكلة عاجلة لم أتمكن من العثور على إجابة لها عبر الويب.
أنا أستخدم CodeFirst EF 4.3.1 وأتلقى رسالة خطأ:Violation of PRIMARY KEY constraint 'PK_T_CRProviders'. Cannot insert duplicate key in object 'dbo.T_CRProviders'.
الكود الخاص بي هو:
عارضات ازياء:
public enum CRProviderEnums
{
PE_Abcd = 0,
PE_Efgh
}
[Table("T_CRProviders")]
public class CRProvider
{
[Key]
[Required]
public int Enum { get; set; }
[Required]
public string Name { get; set; }
}
[Table("T_CRSupportedResources")]
public class CRSupportedResource
{
[Key]
public Guid SupportedResourceId { get; set; }
[Required]
public CRProvider Provider { get; set; }
}
سياق الديسيبل:
public class RSContext : DbContext
{
public DbSet<CRProvider> CRProviders { get; set; }
public DbSet<CRSupportedResource> CRSupportedResources { get; set; }
}
يبدو الجدول T_CRProviders كما يلي: Enum (PK), Name
يبدو الجدول T_CRSupportedResources كما يلي: SupportedResourceId (PK), Provider_Enum (FK).
في جدول قاعدة البيانات T_CRProviders لدي بالفعل موفر بالقيم التالية:
Enum: 0 (which is PE_Abcd)
Name: "PE_Abcd"
الآن يستدعي main() طريقة AddSupportedResource.تضيف هذه الطريقة إلى الجدول T_CRSupportedResources CRSupportedResource جديد الذي يشير إلى الموفر 0 (PE_Abcd).الطريقة تبدو مثل هذا:
public void AddSupportedResource()
{
CRSupportedResource supportedResource = new CRSupportedResource()
{
SupportedResourceId = Guid.NewGuid(),
Provider = new CRProvider()
{
Enum = (int)CRProviderEnums.PE_Abcd,
Name = "PE_Abcd"
}
};
using (RSContext myContext = new RSContext())
{
myContext.CRSupportedResources.Add(supportedResource);
myContext.SaveChanges();
}
}
أتوقع أن هذه الطريقة ستترك الجدول T_CRProviders دون تغيير، وتضيف صفًا جديدًا إلى الجدول T_CRSupportedResources والذي سيبدو كما يلي:
SupportedResourceId: DE532083-68CF-484A-8D2B-606BC238AB61
Provider_Enum (FK): 0 (which is PE_Abcd).
بدلاً من ذلك، عند SaveChanges، يحاول إطار عمل Entity أيضًا إضافة موفر إلى جدول T_CRProviders، وبما أن هذا الموفر موجود بالفعل فإنه يطرح الاستثناء التالي:
An error occurred while updating the entries.
Violation of PRIMARY KEY constraint 'PK_T_CRProviders'. Cannot insert duplicate key in object 'dbo.T_CRProviders'.
The statement has been terminated.
سؤالي:
كيف يمكنني توجيه EF بعدم تحديث الجدول T_CRProviders
عند تحديث الجدول T_CRSupportedResources
?
راجع للشغل، في خادم SQL أرى هذا الجدول T_CRSupportedResources
لديه مفتاح خارجي اسمه FK_RW_TCRSupportedCloudResources_RW_TCRCloudProviders_Provider_Enum
وقاعدة التحديث الخاصة بها لها قيمة No Action
.
المحلول 2
في الواقع، هناك طريقة للقيام بذلك.
شاهد إجابة سؤالي في الرابط التالي:
نصائح أخرى
أتوقع أن تترك هذه الطريقة الجدول T_CRPROVIDERS دون مساس ، وأضف صفًا جديدًا إلى الجدول
لا لن يحدث.أنت تقوم بإنشاء رسم بياني منفصل للكيان يتكون من الكيان الموجود والكيان الجديد.لا تعلم EF بوجود الكيان الخاص بك حتى تبلغه عنه - لا توجد استعلامات قاعدة بيانات للتحقق من وجود الكيان تقوم بها EF في الخلف.
إذا اتصلت Add
الطريقة تتم إضافة جميع الكيانات في الرسم البياني للكيان الخاص بك باعتبارها جديدة.إذا كنت لا ترغب في إدراجها كلها، يمكنك البدء باستخدامها Attach
وتغيير الحالة يدويًا لحالات جديدة.على سبيل المثال مثل:
myContext.CRSupportedResources.Attach(supportedResource);
myContext.Entry(supportedResource).State = EntityState.Added;