Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用guid作为密钥的aspnet标识_Asp.net Mvc_Entity Framework_Asp.net Identity - Fatal编程技术网

Asp.net mvc 使用guid作为密钥的aspnet标识

Asp.net mvc 使用guid作为密钥的aspnet标识,asp.net-mvc,entity-framework,asp.net-identity,Asp.net Mvc,Entity Framework,Asp.net Identity,我正在尝试使用Guid而不是字符串作为主键,并遵循以下帖子:和 我更新了最新的aspnet-identity预发布包 Microsoft ASP.NET Identity Core 2.0.0-beta1 Microsoft ASP.NET Identity EntityFramework 2.0.0-beta1 然后,我创建了自己的dbContext和usermanager,但每次尝试登录时都会出现以下错误: System.Data.SqlClient.SqlException:操作数类型冲

我正在尝试使用Guid而不是字符串作为主键,并遵循以下帖子:和

我更新了最新的aspnet-identity预发布包

Microsoft ASP.NET Identity Core 2.0.0-beta1

Microsoft ASP.NET Identity EntityFramework 2.0.0-beta1

然后,我创建了自己的dbContext和usermanager,但每次尝试登录时都会出现以下错误:

System.Data.SqlClient.SqlException:操作数类型冲突: uniqueidentifier与int不兼容

对于这一行:

var user=await UserManager.FindAsync(model.UserName, 型号(密码)

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

用户对象:

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; }
    }
公共类GuidRole:IdentityRole
{
公共指南()
{
Id=Guid.NewGuid();
}
公共GuidRole(字符串名):this(){name=name;}
}
公共类GuidUserRole:IdentityUserRole{}
公共类GuidUserClaim:IdentityUserClaim{}
公共类GuidUserLogin:IdentityUserLogin{}
公共类用户:IdentityUser
{
公共用户()
{
Id=Guid.NewGuid();
}
公共用户(字符串名称):this(){UserName=name;}
公共字符串名{get;set;}
公共字符串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类newDbContext:IdentityDbContext
{
公共newDbContext()
:base(nameOrConnectionString:“defaultConnection”){}
公共newDbContext(字符串连接字符串)
:base(nameOrConnectionString:connectionString){}
静态newDbContext()
{
Database.SetInitializer(null);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//使用单数表名
基于模型创建(modelBuilder);
modelBuilder.Conventions.Remove();
modelBuilder.Entity().ToTable(“User”).Property(p=>p.Id).HasColumnName(“UserID”);
modelBuilder.Entity().Property(p=>p.Email).HasColumnName(“EmailAddress”);
modelBuilder.Entity().HasKey(r=>new{r.RoleId,r.UserId});
modelBuilder.Entity().ToTable(“UserRole”);
modelBuilder.Entity().Property(r=>r.UserId).HasColumnName(“UserId”);
modelBuilder.Entity().Property(r=>r.RoleId).HasColumnName(“RoleId”);
modelBuilder.Entity().ToTable(“UserLogin”);
modelBuilder.Entity().Property(r=>r.UserId).HasColumnName(“UserId”);
modelBuilder.Entity().ToTable(“UserClaim”);
modelBuilder.Entity().Property(r=>r.Id).HasColumnName(“UserClaimID”);
modelBuilder.Entity().HasKey(r=>r.Id);
modelBuilder.Entity().ToTable(“角色”);
modelBuilder.Entity().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 };
    }
}
公共类应用程序管理员:用户管理员
{
公共应用程序服务器管理器(字符串连接字符串)
:base(新UserStore(newnewdbcontext()))
{
UserValidator=newuservalidator(this){AllowOnlyAlphanumericUserNames=false};
}
}

多亏了Hao Kung的评论,我逐一查看了表和属性映射,直到找到UserClaims表。事实证明,我在数据库中将字段类型设置为uniqueidentifier,但是这仍然需要是一个int。更改它修复了问题

也许可以尝试不使用OnModelCreating作为测试,看看是否有什么东西导致了错误?