Asp.net MVC -使用guid作为键的Asp.net标识



我试图使用Guid的而不是字符串为我的主键,并遵循以下帖子:如何改变类型的id在Microsoft.AspNet.Identity.EntityFramework.IdentityUser和如何在Microsoft.AspNet.Identity.EntityFramework.IdentityUser中更改id类型

我更新到最新的aspnet identity预发布包

微软的ASP。. NET Identity Core 2.0.0-beta1

微软的ASP。. NET Identity EntityFramework 2.0.0-beta1

和编辑我的用户允许Guid的而不是默认字符串,然后我创建了我自己的dbContext和usermanager,但是每次我试图登录我得到以下错误:

System.Data.SqlClient。操作数类型冲突:Uniqueidentifier与int

不兼容

:

var user = await UserManager.FindAsync(model.UserName),model.Password);

我已经检查了,以确保数据库中的所有字段绝对是唯一标识符,我不确定下一步要尝试什么,下面是我目前使用的代码:

用户对象:

public class GuidRole : IdentityRole<Guid, GuidUserRole>
    {
        public GuidRole()
        {
            Id = Guid.NewGuid();
        }
        public GuidRole(string name) : this() { Name = name; }
    }
    public class GuidUserRole : IdentityUserRole<Guid> { }
    public class GuidUserClaim : IdentityUserClaim<Guid> { }
    public class GuidUserLogin : IdentityUserLogin<Guid> { }
    public class User : IdentityUser<Guid, GuidUserLogin, GuidUserRole, GuidUserClaim>
    {
        public User()
        {
            Id = Guid.NewGuid();
        }
        public User(string name) : this() { UserName = name; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

dbContext:

public class newDbContext : IdentityDbContext<User, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim>
{
    public newDbContext()
        : base(nameOrConnectionString: "defaultConnection") { }
    public newDbContext(string connectionString)
        : base(nameOrConnectionString: connectionString) { }
    static newDbContext()
    {
        Database.SetInitializer<newDbContext>(null);
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Use singular table names
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<User>().ToTable("User").Property(p => p.Id).HasColumnName("UserID");
        modelBuilder.Entity<User>().Property(p => p.Email).HasColumnName("EmailAddress");
        modelBuilder.Entity<GuidUserRole>().HasKey(r => new { r.RoleId, r.UserId });
        modelBuilder.Entity<GuidUserRole>().ToTable("UserRole");
        modelBuilder.Entity<GuidUserRole>().Property(r => r.UserId).HasColumnName("UserID");
        modelBuilder.Entity<GuidUserRole>().Property(r => r.RoleId).HasColumnName("RoleID");
        modelBuilder.Entity<GuidUserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<GuidUserLogin>().Property(r => r.UserId).HasColumnName("UserID");
        modelBuilder.Entity<GuidUserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<GuidUserClaim>().Property(r => r.Id).HasColumnName("UserClaimID");
        modelBuilder.Entity<GuidRole>().HasKey<Guid>(r => r.Id);
        modelBuilder.Entity<GuidRole>().ToTable("Role");
        modelBuilder.Entity<GuidRole>().Property(r => r.Id).HasColumnName("RoleID");
        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;
    }
}

最后是用户管理器:

public class ApplicationUserManager : UserManager<User, Guid>
{
    public ApplicationUserManager(string connectionString)
        : base(new UserStore<User, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim>(new newDbContext()))
    {
        UserValidator = new UserValidator<User, Guid>(this) { AllowOnlyAlphanumericUserNames = false };
    }
}

多亏了Hao Kung的评论,我逐个遍历了表和属性映射,直到到达UserClaims表。原来我在数据库中将字段类型设置为uniqueidentifier,但这仍然需要是int类型。改变它解决了问题!

相关内容

  • 没有找到相关文章

最新更新