正确定义EF代码中删除的关系优先

时间:2013-06-12 13:01:46

标签: c# entity-framework ef-code-first

当我从集合中删除实体然后将其保留回来时,我收到以下错误。我知道我需要设置我的关系,以便在删除关系时删除实体,但我无法弄清楚尽管通过Google和SO进行搜索仍需要做什么。

  

因为一个或多个关系无法改变   外键属性是不可为空的。

我有三个表:Role,Permission和RolePermission。我正在尝试从角色中删除RolePermission。

public RoleMap()
{
    HasKey(t => t.Id);
    ToTable("Role");
    Property(t => t.RoleName).HasColumnName("RoleName");

    HasMany(t => t.RolePermissions).WithRequired(t => t.Role).HasForeignKey(t => t.RoleId);
}

public PermissionMap()
{
    HasKey(t => t.Id);
    ToTable("Permission");
    Property(t => t.ApplicationId).HasColumnName("ApplicationId");
    Property(t => t.PermissionName).HasColumnName("PermissionName");
    Property(t => t.IsActive).HasColumnName("IsActive");

    HasRequired(t => t.Application).WithMany(t => t.Permissions).HasForeignKey(t => t.ApplicationId);
}

public RolePermissionMap()
{
    HasKey(t => t.Id);
    ToTable("RolePermission");
    Property(t => t.PermissionId).HasColumnName("PermissionId");
    Property(t => t.RoleId).HasColumnName("RoleId");

    HasRequired(t => t.Permission).WithMany(t => t.RolePermissions).HasForeignKey(t => t.PermissionId);
    HasRequired(t => t.Role).WithMany(t => t.RolePermissions).HasForeignKey(t => t.RoleId);
}

要删除的代码如下所示(所有内容都附加到DBContext):

foreach (RolePermission rolePermission in permissionsToRemove)
{
   role.RolePermissions.Remove(rolePermission);
}

//call commit/saveChanges here

我需要设置什么才能让删除实际导致删除?

1 个答案:

答案 0 :(得分:0)

我认为您根本不需要RolePermission实体,除非您在外键字段之外存储更多信息。因此,尝试在角色和权限之间建立多对多关系。让我用自己的代码向您展示一个示例:

            modelBuilder.Entity<User>()
            .HasMany(u => u.Roles)
            .WithMany(r => r.Users)
            .Map(x => {
                x.ToTable("USER_ROLE_XREF", dbsch);
                x.MapLeftKey("ID_USER");
                x.MapRightKey("ID_ROLE");
            });
相关问题