ef code first - ASP.NET Identity -当使用自定义表名时,将用户ID主键默认类型从字符串更



我使用的是microsoft . asp.net . identity 2.0.0-beta1和Entity Framework 6.1.0-beta1(发布于2014年2月11日)。

当我尝试将用户ID主键的默认类型从字符串更改为int 时,我得到以下错误。MyUsers而不是dbo.AspNetUsers):

"实体类型'IdentityUser'和'ApplicationUser'不能共享表'MyUsers',因为它们不在相同的类型层次结构中,或者它们之间没有有效的一对一外键关系,并且它们之间没有匹配的主键。"

我可以成功地将用户ID PK的默认类型从字符串更改为int或更改默认身份表名称,但我不能同时执行而不遇到此错误。

我的解决方案是基于:

1:来自http://blogs.msdn.com/b/webdev/archive/2013/12/20/announcing-preview-of-microsoft-aspnet-identity-2-0-0-alpha1.aspx的"Make Primary Key type be extensible for Users and Roles"一节。

2:如何在使用Visual Studio 2013 ASP时更改表名?净身份?。

我的实际代码是:

using Microsoft.AspNet.Identity.EntityFramework;
namespace Musetone.Models
{
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
}
public class CustomRole : IdentityRole<int, CustomUserRole>
{
    public CustomRole() { }
    public CustomRole(string name) { Name = name; }
}
public class CustomUserRole : IdentityUserRole<int> { }
public class CustomUserClaim : IdentityUserClaim<int> { }
public class CustomUserLogin : IdentityUserLogin<int> { }
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers", "User").HasKey(u => u.Id).Property(u => u.Id).HasColumnType("int");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers", "User").HasKey(u => u.Id).Property(u => u.Id).HasColumnType("int");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles", "User").HasKey(r => new { r.RoleId, r.UserId }).Property(r => r.UserId).HasColumnType("int");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins", "User").HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey }).Property(l => l.UserId).HasColumnType("int"); 
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims", "User").Property(c => c.UserId).HasColumnType("int"); 
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles", "User").HasKey(r => r.Id); 
    }
}
}

我得到这个错误,即使我删除HasColumnType("int")。

我认为映射可能不正确。在定义ApplicationDbContext类时,您使用的是为角色、登录和声明定义的自定义类,但传递的是用于映射表的基类。对于ChangePK示例,下面的映射适合我。如果这也适用于你,请告诉我。映射应该足够简单

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers");
        modelBuilder.Entity<CustomUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<CustomUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<CustomUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<CustomRole>().ToTable("MyRoles");
    }

相关内容

  • 没有找到相关文章

最新更新