C# 需要将Asp.Net标识(RTM)用户Id从nvarchar(128)更改为uniqueidentifier

C# 需要将Asp.Net标识(RTM)用户Id从nvarchar(128)更改为uniqueidentifier,c#,asp.net,asp.net-membership,asp.net-identity,C#,Asp.net,Asp.net Membership,Asp.net Identity,使用Asp.Net Identity 1.0(RTM版本)。默认实现创建一个AspNetUsers表。Id列类型为nvarchar(128) 在创建数据库和表时,我只想将用户Id的类型更改为uniqueidentifier,而不是nvarchar(128)。我在OnModelCreating覆盖中使用.HasColumnType(“uniqueidentifier”)尝试了这一点。。。但它会抛出错误 微软表示这很容易。。。但我倾向于不同意 由于您可以控制数据库架构,因此可以执行一些常见任务,例

使用Asp.Net Identity 1.0(RTM版本)。默认实现创建一个AspNetUsers表。Id列类型为nvarchar(128)

在创建数据库和表时,我只想将用户Id的类型更改为uniqueidentifier,而不是nvarchar(128)。我在OnModelCreating覆盖中使用.HasColumnType(“uniqueidentifier”)尝试了这一点。。。但它会抛出错误

微软表示这很容易。。。但我倾向于不同意

由于您可以控制数据库架构,因此可以执行一些常见任务,例如更改 表名或更改主键的数据类型很简单


因此,根据他们极其简短和完全非技术性的文档,这似乎是一项常见的任务,更改主键的数据类型。。。但这似乎并不简单。请提供帮助。

来自ASP.NET团队的Hao Kung在此处发布,您需要实现自己的
IUserStore
,但他正在努力使1.1版本更简单

我相信您不仅需要实现
IUserStore
,在我看来,您还需要自己的
UserStore
实现,因为
UserStore
仅限于
IdentityUser

如果我是正确的,这意味着您至少需要实现
IUserStore
IUserPasswordStore
IUserSecurityStampStore
IUserLoginStore

共有14种方法,但大多数方法的实现都非常简单。注意:这不是对
UserStore
的完全替代,它只是支持默认模板中
AccountController
使用的部件所需的


我有一个自己尝试过的项目,也就是说,我实现了一个使用MongoDb而不是EntityFramework来实现持久性的UserStore。

如果您更新到最新的夜间版本,您可以尝试新的1.1-alpha1 API,这应该会使这变得更容易:例如,插入GUI而不是字符串应该是什么样子

    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 GuidUser : IdentityUser<Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> {
        public GuidUser() {
            Id = Guid.NewGuid();
        }
        public GuidUser(string name) : this() { UserName = name; }
    }

    private class GuidUserContext : IdentityDbContext<GuidUser, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> { }
    private class GuidUserStore : UserStore<GuidUser, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> {
        public GuidUserStore(DbContext context)
            : base(context) {
        }
    }
    private class GuidRoleStore : RoleStore<GuidRole, Guid, GuidUserRole> {
        public GuidRoleStore(DbContext context)
            : base(context) {
        }
    }

    [TestMethod]
    public async Task CustomUserGuidKeyTest() {
        var manager = new UserManager<GuidUser, Guid>(new GuidUserStore(new GuidUserContext()));
        GuidUser[] users = {
            new GuidUser() { UserName = "test" },
            new GuidUser() { UserName = "test1" }, 
            new GuidUser() { UserName = "test2" },
            new GuidUser() { UserName = "test3" }
            };
        foreach (var user in users) {
            UnitTestHelper.IsSuccess(await manager.CreateAsync(user));
        }
        foreach (var user in users) {
            var u = await manager.FindByIdAsync(user.Id);
            Assert.IsNotNull(u);
            Assert.AreEqual(u.UserName, user.UserName);
        }
    }
公共类GuidRole:IdentityRole{
公共指南(){
Id=Guid.NewGuid();
}
公共GuidRole(字符串名):this(){name=name;}
}
公共类GuidUserRole:IdentityUserRole{}
公共类GuidUserClaim:IdentityUserClaim{}
公共类GuidUserLogin:IdentityUserLogin{}
公共类GuidUser:IdentityUser{
公共GuidUser(){
Id=Guid.NewGuid();
}
公共GuidUser(字符串名):this(){UserName=name;}
}
私有类GuidUserContext:IdentityDbContext{}
私有类GuidUserStore:UserStore{
公共GuidUserStore(DbContext上下文)
:基本(上下文){
}
}
私有类GuidRoleStore:RoleStore{
公共GuidRoleStore(DbContext上下文)
:基本(上下文){
}
}
[测试方法]
公共异步任务CustomUserGuidKeyTest(){
var manager=newusermanager(newguiduserstore(newguidusercontext());
GuidUser[]用户={
新GuidUser(){UserName=“test”},
新GuidUser(){UserName=“test1”},
新GuidUser(){UserName=“test2”},
新GuidUser(){UserName=“test3”}
};
foreach(用户中的var用户){
UnitTestHelper.issucess(wait manager.CreateAsync(user));
}
foreach(用户中的var用户){
var u=wait manager.FindByIdAsync(user.Id);
Assert.IsNotNull(u);
Assert.AreEqual(u.UserName,user.UserName);
}
}