0

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

例子:

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

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

你的问题那么可能的原因:

  • 您删除提及惯例
  • 你缺少级联删除的关系结表 - 例如,这可以happend使用与现有数据库流利API时。
+0

我会试试这个。是否应该在数据库中启用级联删除,并使用EF中的约定?当我尝试删除连接记录时,发现它们已经消失,我想我读了数据库中的启用级联删除操作会搞砸。 – jedatu 2011-04-08 01:02:54

+0

我不能得到这个工作,因为其他RC 4.1的问题,现在默认的外键是单数。除非将WithMany定义为WithMany(r => r.Users),否则EF将字段名称设置为错误,因为它尝试使用User_Id而不是Users_Id。而且我无法定义WithMany,除非将角色的导航属性返回给用户。 – jedatu 2011-04-08 11:40:18

+0

我决定在这里涉及两个问题。至于级联删除,此答案适用。我强制他们在数据库中,并有效地解决了这个问题。另一个问题是,当你没有表达“具有许多”收集属性的倒数时,EF猜测外键而不是使用流利表达式中提供的那个。 – jedatu 2011-05-05 16:42:34

相关问题