【问题标题】:How do you delete a single record from EF, when you're using generics?当您使用泛型时,如何从 EF 中删除一条记录?
【发布时间】:2017-01-31 18:32:54
【问题描述】:

我遇到了一个问题,可以删除表中的记录,但前提是该表没有子外键关系。现在,当我们有一个父表并想使用 EF 删除记录时,它会失败并显示错误“无法更改关系,因为一个或多个外键属性不可为空”。我已经删除了引用父表的子表上的级联删除。我已经在 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 从任何表中删除单个记录?

【问题讨论】:

  • this 怎么样?实际上我看到它与您提供的链接相同。您只需要翻译它,例如:App.MainDataContext.Set&lt;T&gt;().Attach(row); App.MainDataContext.Set&lt;T&gt;().Remove(row);

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


【解决方案1】:

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

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

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

【讨论】:

  • 很有趣,对我来说出乎意料。级联删除在数据库中定义。我进入设计器中的 EF 模型(.edmx 文件),并根据数据库刷新了那里的实体。我原以为这会延续到 EF 模型中。你所说的告诉我事实并非如此,这让我很吃惊。
  • 我只是从你的错误信息中得出的结论,但是你可以在关联集的属性中查看,我认为它不是级联的,所以将导航属性设置为null,这是合乎逻辑的EF 采取的行动。
  • 我刚刚尝试在关联上将“End1 OnDelete”属性设置为 Cascade(如您所料,它是 None)。并且对另一个与父表具有相似关系的子表也做了同样的事情。然后我编译它。现在,我有 156 个错误而不是 0。像 VS 这样的错误找不到 .edmx 图表中的表。我猜我做错了,试图在 .edmx 图中设置级联删除。我应该在哪里做?
猜你喜欢
  • 2015-12-13
  • 2023-04-01
  • 1970-01-01
  • 2015-10-18
  • 2021-12-19
  • 2022-08-16
  • 2011-09-20
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多