0

到目前为止,我一直通过 Code First 成功使用 EF5 从我的模型中构建我的数据库。但是,我最近遇到了一个(相当)常见的循环/多级联路径问题。我了解问题所在,通常,我通过针对我的实体编写规则以禁用分支一侧的 CascadeOnDelete 来修复它。这种情况和我目前的情况的不同之处在于,我通常在多对多关系中创建中间“连接”表。

因此,例如,我可能有: Users => UserLeagues <= Leagues 然后我这样做:

modelBuilder.Entity<UserLeagues>()
           .HasRequired(u => u.League)
           .WithMany()
           .HasForeignKey(l => l.LeagueId)
           .WillCascadeOnDelete(false);

我在哪里创建了 UserLeague 表(它需要一些额外的信息,所以这是有道理的)。在我最近的案例中,我只需要创建一个多对多关系。所以,我没有费心去创建这个中间表。相反,我让 EF 自动生成它。

结果,我不确定如何在一侧停止级联删除,因为我无法像手动创建该多对多表那样直接访问 UserLeagues 表。有什么建议吗?这是我的模型...

public User {
  public int Id { get; set; }

  public string Name { get; set; }

  public virtual ICollection<League> Leagues { get; set; }
}

public League {
  public int Id { get; set; }

  public int Score { get; set; }

  public virtual ICollection<User> Users { get; set; }
}
4

1 回答 1

0

当您让 EF 自动生成(多对多关系和支持表)时 - you have no way of manually deleting the actual records in the join table, once the relationship is removed(因为您没有将该表映射到实体)。
因此,级联删除需要默认为“开启”。那是'按照惯例'。

您可以一起删除该约定(对于所有多对多 - 以及他们所涉及的 fk-s)......
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

另一种case by case基于此的方法 - 将更改迁移脚本
(假设您正在使用迁移)。

当迁移生成伪代码时 - 它有类似的东西
.ForeignKey("dbo.Leagues", t => t.League_Id, cascadeDelete: true)

只需删除, cascadeDelete: true参数。

但是你最终会得到phantom records(即你需要求助于手动 SQL 或偶尔清理来删除垃圾记录)。

于 2013-05-17T23:39:13.513 回答