具有自动生成链接表的循环和/或多个级联路径

时间:2013-05-17 20:09:16

标签: sql-server entity-framework

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

因此,例如,我可能有:Users =>用户联盟< =联赛 然后我这样做:

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

1 个答案:

答案 0 :(得分: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或偶尔清理以删除垃圾记录)。