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

2024-02-28

我有一些紧急问题,在网上找不到答案。

我正在使用 CodeFirst EF 4.3.1,但收到错误:Violation of PRIMARY KEY constraint 'PK_T_CRProviders'. Cannot insert duplicate key in object 'dbo.T_CRProviders'.

我的代码是:

Models:

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 添加一个引用提供程序 0 (PE_Abcd) 的新 CRSupportedResource。该方法如下所示:

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 时,实体框架还会尝试将 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.

我的问题:

如何指示 EF 不要更新表T_CRProviders更新表后T_CRSupportedResources?

顺便说一句,在 SQL Server 中我看到了那个表T_CRSupportedResources有一个名为FK_RW_TCRSupportedCloudResources_RW_TCRCloudProviders_Provider_Enum其更新规则的值为No Action.


我希望这个方法不会影响表 T_CRProviders, 并向表 T_CRSupportedResources 添加新行

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

如果你打电话Add方法实体图中的所有实体都将作为新实体添加。如果您不想插入所有内容,您可以从使用开始Attach并手动更改新状态。例如:

myContext.CRSupportedResources.Attach(supportedResource);
myContext.Entry(supportedResource).State = EntityState.Added;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架代码优先 - 无法在对象“dbo.T_CRProviders”中插入重复键 的相关文章

随机推荐