实体框架代码优先 - 无法在对象'dbo.T_CRProviders'中插入重复键

may*_*ash 4 entity-framework ef-code-first entity-framework-4.3

我有一些紧急问题,我无法通过网络找到答案.

我正在使用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; }
}
Run Code Online (Sandbox Code Playgroud)

的DbContext:

public class RSContext : DbContext
{
    public DbSet<CRProvider> CRProviders { get; set; }
    public DbSet<CRSupportedResource> CRSupportedResources { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

表T_CRProviders看起来像这样: Enum (PK), Name

表T_CRSupportedResources如下所示: SupportedResourceId (PK), Provider_Enum (FK).

在数据库表T_CRProviders中,我已经有一个具有以下值的提供程序:

Enum: 0 (which is PE_Abcd)
Name: "PE_Abcd"
Run Code Online (Sandbox Code Playgroud)

现在我的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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我希望这个方法将保持表T_CRProviders不变,并向表T_CRSupportedResources添加一个新行,如下所示:

SupportedResourceId: DE532083-68CF-484A-8D2B-606BC238AB61
Provider_Enum (FK): 0 (which is PE_Abcd).
Run Code Online (Sandbox Code Playgroud)

相反,在SaveChanges上,Entity框架也尝试将Provider添加到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.
Run Code Online (Sandbox Code Playgroud)

我的问题:

如何在更新表T_CRProviders时指示EF不更新表T_CRSupportedResources

顺便说一下,在SQL Server中,我看到该表T_CRSupportedResources有一个名为的外键FK_RW_TCRSupportedCloudResources_RW_TCRCloudProviders_Provider_Enum,其Update Rule的值为No Action.

Lad*_*nka 6

我希望这个方法将保持表T_CRProviders不变,并向表T_CRSupportedResources添加一个新行

不,它不会发生.您正在创建由现有实体a和新实体组成的分离实体图.在您通知它之前,EF不知道您的实体是否存在 - 没有数据库查询验证EF在后面执行的存在.

如果您调用Add方法,则实体图中的所有实体都将添加为新实体.如果您不想插入所有这些内容,可以先使用Attach并手动更改新状态.例如:

myContext.CRSupportedResources.Attach(supportedResource);
myContext.Entry(supportedResource).State = EntityState.Added;
Run Code Online (Sandbox Code Playgroud)