c# - ASP.NET MVC 4 Code-First IdentityUserRole 与额外的主键三向关系

标签 c# asp.net-mvc-4 ef-code-first asp.net-identity automatic-migration

我已经在网上搜索了数周,希望能找到解决我在使用 .NET Identity 框架创建数据库时遇到的问题的方法。

我发现的最接近的相关问题之一是:Customised IdentityUserRole primary key

但是我正在使用自动迁移,以避免手动指定 Up 和 Down 方法。

我想要实现的是在我的 UserRoles 表中有一个额外的主键,它派生自 IdentityUserRoles 并且实现如下所示:

public class UserRole : IdentityUserRole
{
    [Key, ForeignKey("Company")]
    public string CompanyId { get; set; }

    public Company Company { get; set; }
}

我的 OnModelCreating 方法如下所示:

...
public DbSet<UserRole> UserRolesExt { get; set; }
...

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<User>().ToTable("Users");
    modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
    // Failed attempt to make property a primary key below:
    modelBuilder.Entity<UserRole>().HasKey(ur => ur.CompanyId).ToTable("UserRoles");
    modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
    modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
    modelBuilder.Entity<IdentityRole>().ToTable("Roles");
}

但是,表格最终看起来像这样:

http://i.imgur.com/n0dne7O.png

让我感到困惑的一件事是它也被设置为可空类型,但我有一种感觉,它指的是我的自定义 Company 类,它只包含原始数据类型。

我想要这个实体的这种三向关系的原因是我的系统将包含几个公司的多个用户,其中每个用户可以是多个公司的成员,因此也可以是该用户的个人角色在给定的公司内。

如果可能的话,我非常希望避免创建自己的 UserStores 和 RoleStores 等,这是我找到的一些解决方案,因为我想保持简单。

我的一个类不是从 Identity 类派生的示例如下所示并且按预期工作:

public class UserModule
{
    [Key, ForeignKey("User"), Column(Order = 0)]
    public string UserId { get; set; }
    public User User { get; set; }

    [Key, ForeignKey("Module"), Column(Order = 1)]
    public string ModuleId { get; set; }
    public Module Module { get; set; }
}

我曾尝试在我的 UserRole 类中摆弄各种版本的数据注释,但没有任何运气。真的没有办法扩展这个 UserRole 类以获得额外的主键,而无需进行重大定制吗?

还应该注意的是,如果我在创建后简单地手动编辑数据库,我能够使所有三个属性成为主键并且表按预期工作。但我非常想知道我怎样才能让它正常工作。

如有任何帮助,我们将不胜感激!

最佳答案

如果我没理解错的话,你想在 IdentityUserRole 中添加一个额外的列类并让该列成为主键的一部分。为此,您必须稍微修改您的 OnModelCreating方法如下:

modelBuilder.Entity<UserRole>()
            .ToTable("UserRoles")
            .HasKey(r => new { r.UserId, r.RoleId, r.CompanyId })
            .HasRequired(r => r.Company).WithMany();

此代码实质上重新定义了主键以同时包含 CompanyId列,然后将其设为必填字段。

您还应该删除 [Key, ForeignKey("Company")]来自 CompanyId 的属性属性,以防止注释干扰流畅的语法。我不认为 modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");行也是必需的,你可以尝试删除它。

关于c# - ASP.NET MVC 4 Code-First IdentityUserRole 与额外的主键三向关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329803/

相关文章:

c# - 自动列出类的属性

c# - .NET 中的多重继承有哪些好的替代方案?

c# - 在带有 .NET MVC 的大型 CRUD View 中使用 IoC 和存储库模式

c# - 在 WPF 中显示多对多分组

c# - 订阅并在第一次操作后立即取消订阅

javascript - 使用Ajax调用接收数据记录时出现问题

asp.net-mvc - 当用户空闲时间为 5 分钟时,如何在 MVC4 中自动注销?

ef-code-first - EF Code First 向查询添加了额外的列,该列不再存在于模型中

entity-framework-4.1 - Entity Framework Code First 一对多关系映射与链接表

c# - 如何在 phantomjsdriver selenium c# 中启用 cookie?