到目前为止,我已成功使用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; }
}
答案 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或偶尔清理以删除垃圾记录)。