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

Rod*_*ira 8 .net c# entity-framework ef-code-first

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

现在,我只有从导航属性FooBar.这是因为在我的真实的情景,这是没有意义的人,从去BarFoo.from Footo 的关系Bar实际上是0,n表示一个Foo不需要实例的实例Bar.

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

create table Foo_Bar(
FooId int not null,
BarId int not null
);
Run Code Online (Sandbox Code Playgroud)

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

modelBuilder.Entity<Foo>()
  .HasMany(t => t.Bars)
  .WithMany()
  .Map(m =>
  {
    m.ToTable("Foo_Bar");
    m.MapLeftKey("FooId");
    m.MapRightKey("BarId");
  });
Run Code Online (Sandbox Code Playgroud)

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

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

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

通过跟踪由实体框架生成的SQL,我也注意到,如果我检索Foo实例并设置它里面的所有酒吧EntityState.Deleted,EF将同时删除记录Foo_BarBar.我要提到的最后一件事是,我正处于一个断开连接的场景中.

我试图搜索它,但似乎我没有使用正确的关键字,因为在这种情况下我找不到任何人.在这一点上,我看到的唯一的解决办法是MapFooBar类,但我希望有办法做到这一点.

- 编辑

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

提前致谢.

Sla*_*uma 7

但是当我删除Foo时,我想删除连接表上的记录,但不删除子表上的记录.这意味着我想要删除Foo_Bar上的记录,但不要将此级联扩展到Bar.

这样的映射可能吗?

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

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

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

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