我有一些紧急问题,在网上找不到答案。
我正在使用 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
.