EF代码首先需要导航属性来删除多对多关系吗?

时间:2011-04-07 21:37:00

标签: entity-framework many-to-many ef-code-first entity-framework-4.1

我有两个POCO参与多对多关系。 “A”具有“B”的集合,但是“B”不需要具有“A”的集合。当我删除“B”时,不会删除Join表中的记录。如果存在Navigation属性,则实体框架代码优先只会删除Join记录。这是正确的还是有另一种方式?

示例:

public class User() { 
   public int Id { get; set; }
   public string Name { get; set; }
   public List<Role> Roles { get; set; }
}

public class Role() { 
   public int Id { get; set; }
   public string Name { get; set; }
}

//... Mapping Config ...//
this.HasMany(x => x.Roles)
   .WithMany(/*can't be expressed without navigation property*/)
   .Map(m => {
      m.MapLeftKey("Users_Id");
      m.MapRightKey("Roles_Id");
      m.ToTable("UserRoleLinks");
   });

//... Deleting a Role that is in use ...//
using(var ctx = new MyDbContext()) {
    var role = ctx.Roles.Find(1);
    ctx.Roles.Remove(role);
    ctx.SaveChanges();
}

在此方案中,删除角色时,UserRoleLinks记录将被孤立。 Mabye有不同的配置方式吗?

1 个答案:

答案 0 :(得分:1)

这应该没有任何问题。默认ManyToManyCascadeDeleteConvention将强制EF使用级联删除创建具有关系的联结表。 Role实体中缺少导航属性对此没有影响。

问题的可能原因:

  • 您删除了上述惯例
  • 您缺少联结表中关系的级联删除 - 例如,在将Fluent API与现有数据库一起使用时会发生这种情况。