实体框架,使用代码优先级联删除 - 如何实现?

时间:2016-02-28 04:49:27

标签: entity-framework

我对EF(V6)相对较新,并且完全被级联删除的无数方面和影响它的设置所困惑。我的主要目标是在代码中执行所有必需的设置,而不必去SQL Svr Mgmt Studio(SSMS)来调整某些内容;这是代码优先的,我希望最终用户能够创建数据库。我的模型,测试,很简单:

客户
供应商
地址
客户有很多地址
供应商有很多地址
客户与供应商之间不共享地址 如果我删除了客户或供应商,则必须同时删除该地址

我不希望在地址中没有任何导航属性,而是保持地址,而不引用其消费者。毕竟这是一个通用的课程 除非有人能提出更好的建议,否则我实际上已经将Address作为CAddress和SAddress的基类,这两个类都可以分别包含特定于Customer和Supplier地址的属性。我最终得到一个Address表,其中包含Discriminator列和每个Address类型的xx_id列。这一切听起来都非常简单,令人惊讶的是删除被证明是多么困难。

我现在需要知道如何可靠地实现级联删除。目前,我能让它工作的唯一方法是将所有Address子项加载到内存中(通过.Include()),并在SSMS中设置级联删除规则。但是(a)在任何时候,我怎么能知道所有的孩子是否都在记忆中? (b)部署应用程序时,我无法手动更改数据库设计。 我还发现,在某一点上,级联删除显然在SSMS中起作用(删除父级和子级也被删除),但除非所有子级都加载到内存中,否则这不能从Remove()/ SaveChanges()中起作用。我原以为通过FK约束进行级联删除避免了在内存中加载子进程的需要 - 是吗?没有?

有人可以解释如何为我的简单模型设置级联删除,在场景中有这么多可能的玩家:WillCascadeOnDelete,使用虚拟,使用的集合类型,加载到内存(或不加载),懒惰/急切加载,在运行时手动/设置FK约束,使用流畅的API和/或注释,Remove(),DeleteObject(),通过foreach手动删除子项以及Remove() - ing父...等等。

我对有用的回复的期待已经急切地加载! 注意:这与this question不同,因为它指的是1对多,没有导航。道具。以及EF设置的许多其他方面。

0 个答案:

没有答案