我有一些紧急问题,网上找不到答案。
我正在使用CodeFirst EF 4.3.1,出现了一个错误:
违反 PRIMARY KEY 约束条件 'PK_T_CRProviders'。无法将重复键插入对象 '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; }
}
DbContext:
public class RSContext : DbContext
{
public DbSet<CRProvider> CRProviders { get; set; }
public DbSet<CRSupportedResource> CRSupportedResources { get; set; }
}
表 T_CRProviders 的结构如下:Enum(主键),Name
表 T_CRSupportedResources 的结构如下:SupportedResourceId(主键),Provider_Enum(外键)。
在数据库表 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 Framework也会尝试将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_CRSupportedResources
时不更新表T_CRProviders
?
顺便提一下,在SQL Server中,我看到表T_CRSupportedResources
有一个名为FK_RW_TCRSupportedCloudResources_RW_TCRCloudProviders_Provider_Enum
的外键,其更新规则的值为无操作
。