Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除独立关联的委托人和受抚养人(一对多)_C#_Sql_Entity Framework - Fatal编程技术网

C# 删除独立关联的委托人和受抚养人(一对多)

C# 删除独立关联的委托人和受抚养人(一对多),c#,sql,entity-framework,C#,Sql,Entity Framework,使用实体框架6和设计器,我们所有的实体都有一个。因此,在模型的属性中没有定义外键 具有以下具有一对多关系的实体: public class Parent { public Guid Id { get; set; } public virtual ICollection<Child> Children { get; set; } } public class Child { public Guid Id { get; set; } public virt

使用实体框架6和设计器,我们所有的实体都有一个。因此,在模型的属性中没有定义外键

具有以下具有一对多关系的实体:

public class Parent
{
    public Guid Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
    public Guid Id { get; set; }
    public virtual Parent Parent { get; set; }
}
如您所见,我们没有在删除时使用
级联
,因为我的团队反对使用它

所以问题是,如果只给父母的
Id
,删除父母及其从属子女的正确方法是什么?

对于delete,我的意思是在调用
.SaveChanges()

之后,两个表中的SQL记录都应该被删除(导致一个
delete
SQL语句),所以我找到了实现这一点的唯一方法,就是显式地将子表加载到内存中,并在实际删除父表之前逐个删除它们

using (var context = new MyDbContext())
{
    var parent = context.Parents.Find(parentId);
    //or use LINQ if you prefer:
    var alternative = context.Parents.Single(p => p.Id == parentId)

    foreach(var child in parent.Children.ToList())
    {
        context.Children.Remove(child);
    }

    context.Parents.Remove(parent);

    context.SaveChanges();
}
请注意
子项
上的
.ToList()
(或
.ToArray()
,如中所述,这是重要的


就性能而言,这并不理想,因为您必须查询数据库中的每个子记录并将其加载到内存中(我认为对于小型应用程序来说,这并不重要)。但是如果不在删除时使用
级联
,我就找不到更好的方法,尽管我不确定这是否真的比这种情况好。

所以我找到了实现这一点的唯一方法,就是显式地将子项加载到内存中,并在实际删除父项之前逐个删除它们

using (var context = new MyDbContext())
{
    var parent = context.Parents.Find(parentId);
    //or use LINQ if you prefer:
    var alternative = context.Parents.Single(p => p.Id == parentId)

    foreach(var child in parent.Children.ToList())
    {
        context.Children.Remove(child);
    }

    context.Parents.Remove(parent);

    context.SaveChanges();
}
请注意
子项
上的
.ToList()
(或
.ToArray()
,如中所述,这是重要的


就性能而言,这并不理想,因为您必须查询数据库中的每个子记录并将其加载到内存中(我认为对于小型应用程序来说,这并不重要)。但是,如果不使用
CASCADE ON DELETE
,我就找不到更好的方法,尽管我不确定这是否真的会比这种情况更好。

听起来您好像在上的DELETE命令上寻找数据库,但我不喜欢触发器中的“隐藏”功能,这与删除时的CASCADE功能一样。也许只是将其构建到(存储库?)删除处理程序的业务逻辑中。@JaredStroeb,没错。我和我的团队也不喜欢这些类型的数据库功能,因为它们最终会隐藏在应用程序的业务逻辑中。但是,本讨论倾向于设计选择。听起来您似乎在上的delete命令上寻找数据库,但我不喜欢触发器中的“隐藏”功能,这与delete功能上的Cascade类似。也许只是将其构建到(存储库?)删除处理程序的业务逻辑中。@JaredStroeb,没错。我和我的团队也不喜欢这些类型的数据库功能,因为它们最终会隐藏在应用程序的业务逻辑中。然而,这种讨论倾向于设计选择。