需要将Asp.Net Identity(RTM)用户ID从nvarchar(128)更改为uniqueidentifier

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

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

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

http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

由于您控制数据库架构,因此很容易执行常见任务,例如更改表名或更改主键的数据类型。

因此,根据他们非常简短和完全非技术性的文档,这似乎是一个常见的任务,改变主键的数据类型……但似乎没有任何简单的事情。 请帮忙。

如果你更新到最新的夜间位,你可以尝试新的1.1-alpha1 api,这应该使这更容易:这是插入Guids而不是字符串应该是什么样的例子

public class GuidRole : IdentityRole { public GuidRole() { Id = Guid.NewGuid(); } public GuidRole(string name) : this() { Name = name; } } public class GuidUserRole : IdentityUserRole { } public class GuidUserClaim : IdentityUserClaim { } public class GuidUserLogin : IdentityUserLogin { } public class GuidUser : IdentityUser { public GuidUser() { Id = Guid.NewGuid(); } public GuidUser(string name) : this() { UserName = name; } } private class GuidUserContext : IdentityDbContext { } private class GuidUserStore : UserStore { public GuidUserStore(DbContext context) : base(context) { } } private class GuidRoleStore : RoleStore { public GuidRoleStore(DbContext context) : base(context) { } } [TestMethod] public async Task CustomUserGuidKeyTest() { var manager = new UserManager(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); } } 

来自ASP.NET团队的Hao Kung已经在StackOverflow上发布了你需要实现自己的IUserStore ,但他正在努力使1.1版更容易。

我相信你不仅需要实现IUserStore ,对我来说,看起来你需要自己的UserStore实现,因为UserStore仅限于IdentityUser

如果我是正确的,这意味着您至少需要实现IUserStoreIUserPasswordStoreIUserSecurityStampStoreIUserLoginStore

这是14种方法,但大多数方法都非常直接实现。 请注意,这不是UserStore的完全替代品,它只是您需要从默认模板支持AccountController中使用的部件。

我在GitHub上有一个项目,我自己尝试了这个项目,即我实现了一个使用MongoDb而不是EntityFramework进行持久化的UserStore。