在asp.net MVC5 EF6中使用流畅的api映射表?

时间:2013-10-20 06:44:28

标签: claims-based-identity entity-framework-6 asp.net-identity

我正在尝试将配置文件/成员资格信息添加到我的MVC5应用程序中并添加配置映射。

我收到以下错误消息:

  

my.Models.IdentityUserLogin :: EntityType'IdentityUserLogin'没有   键定义。定义此EntityType的密钥。

     

my.Models.IdentityUserRole :: EntityType'IdentityUserRole'没有密钥   定义。定义此EntityType的密钥。

     

IdentityUserLogins:EntityType:EntitySet'IdentityUserLogins'是   基于没有定义键的类型'IdentityUserLogin'。

     

IdentityUserRoles:EntityType:EntitySet'IdentityUserRoles'基于   在类型'IdentityUserRole'上没有定义键。

public class ApplicationUser : IdentityUser
{
    public string City { get; set; }
    public string Discriminator { get; set; }

    public string Address { get; set; }     
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ApplicationUserConfiguration());           
    }
}

3 个答案:

答案 0 :(得分:22)

致电base.OnModelCreating(modelBuilder)并没有为我解决问题。

在VS2013-Preview,VS2013-RC和VS2013-RTM中,Microsoft.AspNet.Identity.EntityFramework的行为似乎有所不同。我正在使用RTM版本。

从IdentityUser继承后,我必须重新创建模型中的所有其他主键才能使其工作:

public class ApplicationUser : IdentityUser
{
    public string DisplayName { get; set; }
}


public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("DefaultConnection") { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
        modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
        modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
    }

(见Configuring/Mapping Properties and Types with the Fluent API

我想在AspNet.Identity.EntityFramework上工作正在进行中,这将被修复(?)

答案 1 :(得分:18)

添加配置后调用base.OnModelCreating(modelBuilder)

答案 2 :(得分:0)

围绕OnModelCreating方法执行以下步骤,并在每个方法之后进行测试以了解是否生效:

  1. 确保您有一个Context以防止他们的规则冲突。
  2. 在提到的内部呼叫base.OnModelCreating(modelBuilder); 方法(首先)
  3. 在方法中添加以下内容和预览步骤:

  4. modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });