C# 更新实体/模型时发生EF错误:UPDATE语句与外键约束冲突
我有一个名为C# 更新实体/模型时发生EF错误:UPDATE语句与外键约束冲突,c#,.net,sql-server,entity-framework,foreign-keys,C#,.net,Sql Server,Entity Framework,Foreign Keys,我有一个名为RFM\u NOTF\u Notifications的表,它引用了另一个表RFM\u NotificationsDetail。我正在使用EF与数据库进行通信,通知详细信息实体有一个通知列表 当我试图更新通知列表时,我遇到以下错误: UPDATE语句与外键约束“FK_RFM_NOTF_Notifications_RFM_NotificationsDetail”冲突。冲突发生在数据库“RegulatoryFileManagementScrumQA”、表“dbo.RFM\u Notific
RFM\u NOTF\u Notifications
的表,它引用了另一个表RFM\u NotificationsDetail
。我正在使用EF与数据库进行通信,通知详细信息
实体有一个通知列表
当我试图更新通知列表时,我遇到以下错误:
UPDATE语句与外键约束“FK_RFM_NOTF_Notifications_RFM_NotificationsDetail”冲突。冲突发生在数据库“RegulatoryFileManagementScrumQA”、表“dbo.RFM\u NotificationsDetail”、列“RFM\u NotificationDetailID”中
这是存储库中的添加/更新方法:
private void CreateNotifications(GeneralBO file, RFM_NOTD_NotificationsDetail notfFile)
{
foreach (NotificationsBO notf in file.Notifications)
{
RFM_NOTF_Notifications nt = new RFM_NOTF_Notifications
{
RFM_NOTF_B_Description = notf.Description
};
if(notf.Id > 0) // Save
{
nt.RFM_NOTF_P_NotificationID = notf.Id;
nt.RFM_NOTD_F_NotificationDetailID = file.Id;
nt.RFM_NOTF_M_ModifiedById = file.CreatedById;
nt.RFM_NOTF_M_ModifiedDateTime = DateTime.Now;
new GenericRepository<RFM_NOTF_Notifications>(_dbContext).update(nt);
}
else
{
nt.RFM_NOTF_M_CreatedById = file.CreatedById;
nt.RFM_NOTF_M_CreatedDateTime = DateTime.Now;
notfFile.RFM_NOTF_Notifications.Add(nt);
}
}
}
我的桌子是:
首先让我解释一下这个错误的含义
Update语句与外键冲突
这仅仅意味着表通知
的主键是通知详细信息
表中的外键,因此您无法更改它,因为它显然存在冲突
以下是一些您可以尝试的解决方案。(不推荐)
- 首先删除通知详细信息,然后删除通知
或者更好的解决方法是使用
- Fluent API实现级联删除,一旦从通知表中删除数据,就会从通知详情表中删除值
您可以在数据库中使用
ALTER TABLE TableName
ADD CONSTRAINT [New_FK_Constraint]
FOREIGN KEY (ColumnName) REFERENCES SecondTable(ColumnName)
ON DELETE CASCADE ON UPDATE CASCADE
GO
如果有更新
您需要使用Entity Framework的EntityStateModified属性来更好地实现更新功能我怀疑nt.RFM\u NOTD\u F\u NotificationDetailID=file.Id
我认为NotificationDetails
表中没有file.Id
的记录
有件事引起了我的注意,有一个参数通过名为RFM\u noted\u notifications detail notfFile
的方法传递。我不知道这些数据是从哪里来的,它的目的是什么,但你会这样尝试吗
nt.RFM_NOTD_F_NotificationDetailID = notfFile.Id;
nt.RFM_NOTD_F_NotificationDetailID = notfFile.Id;