ila*_*man 6 c# entity-framework cascade
我有这样的场景:我有这些课程:
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;}
}
Run Code Online (Sandbox Code Playgroud)
A类具有B类的集合,Ci类具有一个B类和不同的基类.当在A类集合中只有B不能引用它时,我可以删除A类并且所有B集合也被删除(级联删除).但是当在A类集合中有B类时Ci引用它我不能删除A类实例...
我的预期行为:
A类将被删除,A类的所有B集合都被删除,如果Ci引用了集合中的某些B,它将在删除结束时为空.(类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;
}
}
Run Code Online (Sandbox Code Playgroud)
有人知道如何实现吗?
这可能是这样的情况:您编写一个存储过程来处理级联删除逻辑,并且 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
Run Code Online (Sandbox Code Playgroud)
调用未映射到 EF 模型中的 SP 的示例:
SqlParameter param1 = new SqlParameter("@Id", 12345); context.Database.ExecuteSqlCommand("DeleteMyObject @Id",param1);
进一步阅读:http://msdn.microsoft.com/en-us/data/gg699321.aspx