gpt4 book ai didi

c# - ef代码先复杂化级联删除场景

转载 作者:太空狗 更新时间:2023-10-29 21:57:57 24 4
gpt4 key购买 nike

我有这个场景:我有这些类:

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);

进一步阅读:http://msdn.microsoft.com/en-us/data/gg699321.aspx

关于c# - ef代码先复杂化级联删除场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com