c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除

c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除,第1张

概述我正在尝试使用Entity Framework Code First Fluent API映射现有数据库.我在与多对多关系和级联删除的情况下苦苦挣扎. 这是我的两个POCO课程: public class Foo{ public int FooId; public string FooDescription; public IList<Bar> Bars;}public clas 我正在尝试使用Entity Framework Code First Fluent API映射现有数据库.我在与多对多关系和级联删除的情况下苦苦挣扎.

这是我的两个POCO课程:

public class Foo{  public int FooID;  public string FooDescription;  public IList<bar> bars;}public class bar{  public int barID;  public string barDescription;}

现在,我只有一个从Foo到bar的导航属性.那是因为在我真实的场景中,任何人从bar到Foo都没有意义.从Foo到bar的关系实际上是0,n,这意味着Foo的一个实例不需要bar的实例.

我现有的数据库在这两个表之间有一个连接表.此表如下所示:

create table Foo_bar(FooID int not null,barID int not null);

因为我不想在我的项目中创建这样的POCO类,所以我映射了这样的表:

modelBuilder.Entity<Foo>()  .HasMany(t => t.bars)  .WithMany()  .Map(m =>  {    m.Totable("Foo_bar");    m.MapleftKey("FooID");    m.MapRightKey("barID");  });

这适用于插入.实体在Foo上插入,然后在现有的Foo_bar表上插入.

但是当我删除Foo时,我想删除连接表上的记录,但不删除子表上的记录.意思是我想要删除Foo_bar上的记录,但不要将此级联扩展到bar.

这样的映射可能吗?我应该提一下,在我的上下文中,我删除了OnetoManyCascadeDeleteConvention和ManyToManyCascadeDeleteConvention,因为99%的时间我不会使用级联删除.这是一个具体情况.

通过跟踪Entity Framework生成的sql,我还注意到如果我检索一个Foo实例并将其中的所有bars设置为EntityState.Deleted,EF将删除Foo_bar和bar中的两个记录.我要提到的最后一件事是我在一个断开连接的场景中工作.

我尝试搜索这个,但似乎我没有使用正确的关键字,因为在这种情况下我找不到任何人.在这一点上,我看到的唯一解决方案是映射一个Foobar类,但我希望有一种方法可以做到这一点.

– 编辑

看来我的删除方法起初是错误的.当我尝试删除时,我没有传递Foo的实例,其中的bar列表已填满.在更改之后,Entity Framwork为列表中的每个bar创建一个delete语句.我仍然有更新问题,如同时添加和删除项目.会做更多的测试并发布在这里.

提前致谢.

解决方法

But when I delete a Foo,I would like to delete the records on the
join table but not on the child table. Meaning I want to delete
records on Foo_bar but not to extend this cascade to bar.

Is such a mapPing possible?

这实际上是唯一可行的映射.您不能将级联删除扩展到bar表,因为在关系中(从数据库模式的角度来看),Foo_bar连接表是关系中的依赖项,而bar是主体.通常,cacscading delete仅在删除主体时有效,但在删除从属时不会生效.

因此,您不必担心在删除Foo时可能会删除bar,并且您不必为此应用任何特殊设置.

但是,当您删除ManyToManyCascadeDeleteConvention时,您会遇到问题.它针对整个模型进行全局 *** 作,并且没有选项可以针对特定的多对多关系再次启用级联删除. (对于多对多关系,没有WillCascadeOnDelete(true),就像一对多或一对一的关系一样.)

您确定在模型中真的需要删除ManyToManyCascadeDeleteConvention吗?我从来没有遇到一个模型,当删除其中一个连接的实体(Foo或bar)时,不删除连接表中的相关条目是有意义的.

总结

以上是内存溢出为你收集整理的c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除全部内容,希望文章能够帮你解决c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1243269.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存