当您使用泛型时,如何从EF中删除单个记录?

时间:2017-01-31 18:32:54

标签: c# sql-server entity-framework generics

我遇到了删除表中记录的问题,但只要该表没有子外键关系。现在,当我们有一个父表并希望使用EF删除该记录时,它会失败并出现错误,"由于一个或多个外键属性不可为空,因此无法更改关系。 #34;我删除了引用父表的子表上的级联删除。我在SSMS中对它进行了测试。它工作正常。但是从C#中它失败了。我们有一个视图模型,我们已经定义了一个通用的DeleteRow方法。只要被删除的行没有子表,这就很有效。如果表是父表,则失败。我尝试在Stackoverflow上查找答案并遇到了这个问题,现已关闭:stackoverflow.com/questions/17723276/delete-a-single-record-from-entity-framework。这个问题的答案在EF中使用了一个离散表。我们正在使用泛型。这是我们的代码:

public void DeleteRow(T row)
{
    if (App.MainDataContext != null && row != null)
    {
        App.MainDataContext.Entry<T>(row).State = EntityState.Deleted;
        App.MainDataContext.SaveChanges();
    }
}

我不相信将State属性设置为枚举EntityState.Deleted正在工作,因为它只为父表中的记录设置它,而不是为子中的任何相关记录设置它表。 (MainDataContext是来自.EDMX文件的实体。)当我们使用泛型传递表类型时,如何使用EF 6从任何表中删除单个记录?

1 个答案:

答案 0 :(得分:0)

问题在于,当您将状态设置为已删除时,也会加载相关实体(由上下文的更改跟踪器跟踪)。当您删除行时,EF会尝试将父导航属性设置为null,但它是一个不可为空的关系。

要解决此问题,您必须在模型中的关系(EDMX)中设置级联删除,而不仅仅是在数据库中。

如果您的上下文实例未跟踪相关实体,它也应该有效。在这种情况下,在SQL-Server端,级联删除应该有效。