رمز إطار عمل الكيان أولاً - لا يمكن إدراج مفتاح مكرر في الكائن "dbo.T_CRProviders"

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

سؤال

لدي مشكلة عاجلة لم أتمكن من العثور على إجابة لها عبر الويب.

أنا أستخدم 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

في الواقع، هناك طريقة للقيام بذلك.

شاهد إجابة سؤالي في الرابط التالي:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/62f3e5bc-c972-4622-b830-e7d7fe710101

نصائح أخرى

أتوقع أن تترك هذه الطريقة الجدول T_CRPROVIDERS دون مساس ، وأضف صفًا جديدًا إلى الجدول

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

إذا اتصلت Add الطريقة تتم إضافة جميع الكيانات في الرسم البياني للكيان الخاص بك باعتبارها جديدة.إذا كنت لا ترغب في إدراجها كلها، يمكنك البدء باستخدامها Attach وتغيير الحالة يدويًا لحالات جديدة.على سبيل المثال مثل:

myContext.CRSupportedResources.Attach(supportedResource);
myContext.Entry(supportedResource).State = EntityState.Added;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top