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有不同的配置方式吗?
我会试试这个。是否应该在数据库中启用级联删除,并使用EF中的约定?当我尝试删除连接记录时,发现它们已经消失,我想我读了数据库中的启用级联删除操作会搞砸。 – jedatu 2011-04-08 01:02:54
我不能得到这个工作,因为其他RC 4.1的问题,现在默认的外键是单数。除非将WithMany定义为WithMany(r => r.Users),否则EF将字段名称设置为错误,因为它尝试使用User_Id而不是Users_Id。而且我无法定义WithMany,除非将角色的导航属性返回给用户。 – jedatu 2011-04-08 11:40:18
我决定在这里涉及两个问题。至于级联删除,此答案适用。我强制他们在数据库中,并有效地解决了这个问题。另一个问题是,当你没有表达“具有许多”收集属性的倒数时,EF猜测外键而不是使用流利表达式中提供的那个。 – jedatu 2011-05-05 16:42:34