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;