使用int主键而不是GUID的MVC 5标识

时间:2014-03-03 08:46:01

标签: int asp.net-mvc-5 guid asp.net-identity

我已经将MVC 5 Indentity提供程序实现为我的安全模块,并且无法将表链接到我现有的数据库,因为我使用的是int主键,而Asp表正在使用GUID。 有谁知道我是否可以改变Asp表使用int代替? 我曾尝试通过Google搜索找到有关该主题的一些信息,但找不到有价值的东西。 我将继续尝试,并在我获得更多信息时提供有关该主题的详细信息。我只是希望有人能通过指出我可以提供一些见解的方向来节省一些时间。

更多信息:

我的项目尽可能使用一些WebApi而不是控制器来使用MVC 5。 我使用Entity Framework 6与MSSQL数据库进行通信。

1 个答案:

答案 0 :(得分:1)

在此hao-kung

中按post查看此答案

因此,如果您需要int ID,则需要创建自己的POCO IUser类,并在1.0 RTM版本中为您的自定义IUser类实现IUserStore。

这是我们没有时间支持的事情,但我正在研究如何在1.1版本中轻松实现这个目标。希望很快就能在夜间建造中获得一些东西。

更新了1.1-alpha1示例:如何获得夜间建筑

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

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);
    }
}