【问题标题】:What's the proper way to delete entities in Entity Framework?在实体框架中删除实体的正确方法是什么?
【发布时间】:2019-08-08 09:51:47
【问题描述】:

我很难删除对象树。我的模型没有使用任何内置的级联删除机制,因此我必须执行每个相关实体的显式删除。

我要删除的实体有 3 级间接(导航属性)

class Parent 
{
    public ICollection<Child> Children { get; set; }
}

class Child 
{
    public ICollection<Grandchild> Grandchildren { get; set; }      
}

public class Grandchild 
{   
}

我的 DbContext 是

public class Context 
{
    DbSet<Parent> Root {get; set;}
    DbSet<Grandchild> Grandchildren {get; set;}
}

请注意,上下文不会为 Children 类公开 DbSet。

那么,删除Parent 下所有内容的正确方法是什么?

【问题讨论】:

  • 请告诉我们您当前要删除的代码

标签: c# .net entity-framework


【解决方案1】:

首先你需要确定,Entity Framework has a Foreign Key

那你应该可以cascade delete:

级联删除自动删除依赖记录或设置null为 数据库中删除父记录时的 ForeignKey 列。

在实体框架中默认为所有类型启用级联删除 的关系,例如一对一、一对多和多对多。

所以下面的代码应该删除每个孩子

var parent = _dbContext.Single(predicate)
_dbContext.Remove(parent);
_dbContext.SaveChanges();

【讨论】:

  • 感谢您的回答,但我认为这对我不起作用。我使用的上下文是使用 DB-First 方法生成的,我无法控制它。每个相关实体都会生成一个导航属性和一个外键。我收到这样的错误:SqlException:DELETE 语句与 REFERENCE 约束“FK_XXX_XXX”冲突。冲突发生在数据库“XXXX_XXXX”、表“ABC”、列“ID_XXXX”中。声明已终止。
【解决方案2】:

我想删除不需要的 DbSet 声明然后迁移数据库就足够了。 电源:

dotnet ef migrations add [name]
dotnet ef database update

编辑:以上适用于您使用代码优先方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多