gpt4 book ai didi

ef-code-first - ASP.NET 标识 - 将用户 ID 主键默认类型从字符串更改为 int 并且使用自定义表名时出错

转载 作者:行者123 更新时间:2023-12-04 03:35:21 25 4
gpt4 key购买 nike

我正在使用 Microsoft.AspNet.Identity 2.0.0-beta1 和 Entity Framework 6.1.0-beta1(2014 年 2 月 11 日发布)。

当我尝试将用户 ID 主键的默认类型从 string 更改为 int 时出现以下错误和 当我尝试使用自定义表名时(所以 User.MyUsers 而不是 dbo.AspNetUsers):

“实体类型 'IdentityUser' 和 'ApplicationUser' 无法共享表 'MyUsers',因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系以及它们之间匹配的主键。”

我可以成功地将用户 ID PK 的默认类型从 string 更改为 int 或更改默认标识表名称,但我不能同时做 一起没有遇到这个错误。

我的解决方案基于:

1:来自 http://blogs.msdn.com/b/webdev/archive/2013/12/20/announcing-preview-of-microsoft-aspnet-identity-2-0-0-alpha1.aspx 的“使用户和角色的主键类型可扩展”部分.

2:How can I change the table names when using Visual Studio 2013 ASP.NET Identity? .

我的实际代码是:

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");
}

关于ef-code-first - ASP.NET 标识 - 将用户 ID 主键默认类型从字符串更改为 int 并且使用自定义表名时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22284610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com