C# 删除独立关联的委托人和受抚养人(一对多)
使用实体框架6和设计器,我们所有的实体都有一个。因此,在模型的属性中没有定义外键 具有以下具有一对多关系的实体: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
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,没错。我和我的团队也不喜欢这些类型的数据库功能,因为它们最终会隐藏在应用程序的业务逻辑中。然而,这种讨论倾向于设计选择。