- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有这个场景:我有这些类:
public class A
{
public int Id {get;set;}
public virtual ICollection<B> bCollection {get; set; }
}
public class B
{
public int Id {get;set;}
}
public class C1 : BaseClass1
{
public int Id{get;set;}
public virtual B B{get;set;}
}
public class C2 : BaseClass2
{
public int Id {get;set;}
public virtual B B {get;set;}
}
...
public class C100 : BaseClass100
{
public int Id {get;set;}
public virtual B B {get;set;}
}
A 类有 B 类的集合,Ci 类有一个 B 类和不同的基类。当 A 类集合中只有 Ci 未引用它的 B 时,我可以删除 A 类并且所有 B 集合也被删除(级联删除)。 但是当在 A 类集合中有 C 类引用它的 B 时,我无法删除 A 类实例...
我的预期行为:
A类和A类拥有的所有B集合,如果Ci引用了集合中的某些B,则在删除结束时为null。(Ci类实例不会被删除!),我也不想迭代抛出我所有的 Ci 类,看看它是否引用了需要删除的 B 集合。
我不想要这段代码:
MyDbContext db=new MyDbContext();
Hash<int> bCollectionToDelete=GetBCollectionToDeleteHashSet();
var C1_db_collection= db.C1Collection.ToList();
foreach(var c1Item in C1Collection)
{
if(bCollectionToDelete.Contains(c1Item.refrenceIdToB)
{
c1Item.refrenceIdToB=null;
}
}
var C2_db_collection= db.C2Collection.ToList();
foreach(var c2Item in C1Collection)
{
if(bCollectionToDelete.Contains(c2Item.refrenceIdToB)
{
c2Item.refrenceIdToB=null;
}
}
...
var C100_db_collection= db.C100Collection.ToList();
foreach(var c100Item in C100Collection)
{
if(bCollectionToDelete.Contains(c100Item.refrenceIdToB)
{
c100Item.refrenceIdToB=null;
}
}
有人知道如何实现吗?
最佳答案
在这种情况下,您可能会编写一个存储过程来处理级联删除逻辑,而 EF 代码仅对“DeleteMyObject”sp 进行一次调用,然后您的 ef 代码将需要刷新其上下文以重新加载之后立即发生变化。
您将付出轻微的性能损失来刷新您的上下文,但如果我不得不猜测将逻辑移动到 sp,并且在那里进行相互关联的删除所带来的性能提升,将足以抵消拥有的小性能损失刷新。
不确定 SP 是否适合您,但它们可以在您需要时使用。
编辑:
非常简化的存储过程示例,它接受表“MainTable”的主键,然后从 3 个“ChildTables”中删除任何相关记录(如果存在)。你的实际逻辑可能有点复杂:
CREATE PROCEDURE DeleteMyObject @Id INT
as
BEGIN TRAN
delete from ChildTable1 WHERE ParentId=@Id
delete from ChildTable2 WHERE ParentId=@Id
delete from ChildTable3 WHERE ParentId=@Id
delete from MainTable WHERE ID=@Id
COMMIT TRAN
调用未映射到您的 EF 模型的 SP 的示例:
SqlParameter param1 = new SqlParameter("@Id", 12345); context.Database.ExecuteSqlCommand("DeleteMyObject @Id",param1);
关于c# - ef代码先复杂化级联删除场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378935/
我是一名优秀的程序员,十分优秀!