EF中的多对多映射

时间:2014-02-19 22:04:20

标签: c# .net entity-framework many-to-many

我们在EF中有一个案例:

我们有3个实体,比如用户,角色和部门。用户可以在每个部门中扮演一个或多个角色,这些角色可以是活动的或非活动的。因此,Mapping表中的列如下:

UserId,RoleId,DeptId,IsActive

我们目前正在通过为映射表创建另一个实体来管理映射,如果我必须删除关系,它会强制手动执行删除操作。

有没有一种方法可以在没有映射表的任何实体的情况下实现。

提前致谢。

1 个答案:

答案 0 :(得分:0)

不,您无法避免连接实体创建,因为它不包含外键 - 您有IsActive列。即它不是pure join table(PJT):

  

实体框架(Entity Framework)创建多对多关系   在数据模型中,表示多对多的连接表   关系只包含键。当Entity Framework创建数据时   模型,它不直接在数据模型中表示PJT表。   相反,实体框架创建了直接导航关系   在相关表之间,称为多对多关联。

但是在您的情况下,即使删除其他列也无济于事,因为实体框架需要在每一侧都有连接实体的集合(即直接导航关系)。但是,因此您将每个实体与其他两个实体连接起来,如果不提供额外的连接实体,则无法拥有此实体。

更新:您可以使用WillCascadeOnDelete

为此关系配置级联删除
modelBuilder.Entity<User>()
    .HasMany(u => u.RoleDepartments)
    .WithRequired(urd => urd.User)
    .WillCascadeOnDelete();

modelBuilder.Entity<Role>()
    .HasMany(r => r.UserDepartments)
    .WithRequired(urd => urd.Role)
    .WillCascadeOnDelete();

modelBuilder.Entity<Department>()
    .HasMany(d => d.UserRoles)
    .WithRequired(urd => urd.Department)
    .WillCascadeOnDelete();