Using Asp.Net Identity 1.0(RTM 版本)。默认实现创建一个 AspNetUsers 表。Id 列类型是 nvarchar(128)。
创建数据库和表时,我只想将用户 ID 的类型更改为唯一标识符而不是 nvarchar(128)。我尝试过使用 .OnModel中创建覆盖中的HasColumnType("uniqueidentifier")但它会抛出错误。
Microsoft表明这很容易...但我倾向于不同意...
http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity
由于您控制数据库架构,因此常见任务(如更改) 表名或更改主键的数据类型很容易。
因此,根据他们极其简短且完全非技术性的文档,这似乎是一项常见的任务,更改主键的数据类型......但似乎没有什么简单的事情。请帮忙。
ASP.NET 团队的Hao Kung在StackOverflow上发帖说,你需要实现自己的IUserStore
,但他正在努力使1.1版本更容易。
我相信您不仅要实现IUserStore
,对我来说,您似乎需要自己的UserStore
实现,因为UserStore<TUser>
仅限于IdentityUser
。
如果我是对的,这意味着您至少需要实现IUserStore
、IUserPasswordStore
、IUserSecurityStampStore
和IUserLoginStore
。
这是 14 种方法,其中大多数都很容易实现。请注意,这不是UserStore<TUser>
的完全替代品,它只是您需要支持默认模板AccountController
中使用的部分。
我在GitHub上有一个项目,我自己尝试过这个,即我实现了一个使用MongoDb而不是EntityFramework进行持久性的用户存储。
如果您更新到最新的夜间位,您可以尝试新的 1.1-alpha1 API,现在应该会更容易: 例如,插入 Guid 而不是字符串应该是这样的
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);
}
}