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

Posted

技术标签:

【中文标题】在 asp.net MVC5 EF6 中使用流利的 api 映射表?【英文标题】:Map tables using fluent api in asp.net MVC5 EF6? 【发布时间】:2013-10-28 18:33:04 【问题描述】:

我正在尝试将个人资料/会员信息添加到我的 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());           
    

【问题讨论】:

【参考方案1】:

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

Microsoft.AspNet.Identity.EntityFramework 的行为在 VS2013-Preview、VS2013-RC 和 VS2013-RTM 中似乎有所不同。我正在使用 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 的工作正在进行中,这将得到修复 (?)

【讨论】:

我不得不做同样的事情来解决这个问题。我以为 EF 会自动挑选实体 ID? 这一切都为我解决了!非常感谢 - 应标记为已回答:) 我遇到了类似的问题并尝试了这个解决方案并认为它解决了问题,但是我在数据库中获得了一些额外的表,例如 IdentityUsers,而且我还有 AspNetUsers 表。我做错了什么? @LaurenceNyein place base.OnModelCreating(modelBuilder) 作为方法中的最后一次调用。 ***.com/questions/19913447/… 为我修复了它【参考方案2】:

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

【讨论】:

如果这不起作用..尝试在配置之前调用它 如果使用 IdentityDbContext&lt;ApplicationUser&gt;OnModelCreating 被覆盖,并且我没有手动配置 IdentityUserLoginIdentityUserRoleIdentityUserClaim 属性或流畅的 API。【参考方案3】:

围绕OnModelCreating方法执行以下步骤,并在每个步骤后进行测试以确保生效:

    确保您有一个Context,以防止他们的规则冲突。 拨打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 );

【讨论】:

以上是关于在 asp.net MVC5 EF6 中使用流利的 api 映射表?的主要内容,如果未能解决你的问题,请参考以下文章

基于 jQuery 的专业 ASP.NET WebForms/MVC 控件库!

亲测Asp.net Mvc5 + EF6 code first 方式连接MySQL总结

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(57)-插件---ueditor使用

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统--工作流演示截图

ASP.NET MVC5+EF6+EasyUI 后台管理系统(84)-Quartz 作业调度用法详解一

构建ASP.NET MVC5+EF6+EasyUI 1.5+Unity4.x注入的后台管理系统-前言与目录(持续更新中...)