Идентификатор GUID для идентификации
Как изменить столбец PK таблицы AspNetUser
с помощью типа данных guid
to int
?
Теперь это возможно с последней версией asp.net-identity
, выпущенной сегодня.
Но я не могу найти нигде, как это делается?
Ответы
Ответ 1
По умолчанию идентификатор ASP.NET(с использованием Entity Framework) использует строки как первичные ключи, а не идентификаторы GUID, но он хранит идентификаторы GUID в этой строке.
Вам нужно определить еще несколько классов, я только что создал новый проект (я использую VS2013 Update 2 CTP), вот модели, которые нужно изменить:
public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationUserRole : IdentityUserRole<int>
{
}
public class ApplicationUserLogin : IdentityUserLogin<int>
{
}
public class ApplicationUserClaim : IdentityUserClaim<int>
{
}
public class ApplicationRole : IdentityRole<int, ApplicationUserRole>
{
}
public class ApplicatonUserStore :
UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicatonUserStore(ApplicationDbContext context)
: base(context)
{
}
}
public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Вам также потребуется обновить несколько других мест, просто следуйте за ошибками компиляции, наиболее распространенным изменением будет необходимость конвертировать возвращаемую строку формы User.Identity.GetUserId() для целого числа.
Кроме того, при ответе на еще один вопрос (я действительно задал вопрос), я представил примерное решение, которое делает именно это, см. ниже:
https://github.com/JSkimming/AspNet.Identity.EntityFramework.Multitenant
Ответ 2
если кто-нибудь найдет это при поиске руководства по идентификации 3.0:
public class ApplicationUser : IdentityUser<int>
{
}
public class ApplicationRole : IdentityRole<int>
{
}
public class ApplicationDbContext:
IdentityDbContext<ApplicationUser, ApplicationRole, int>
{
}
в файле Startup.cs, ConfigureServices:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext, int>()//, int being the only difference
.AddDefaultTokenProviders();
и что для него нет необходимости создавать своих менеджеров, например, в версии 2.0
нашел это в этом сообщении в блоге.
Ответ 3
взгляните на этот ответ hao-kung в этом сообщении
Итак, если вы хотите установить идентификаторы, вам нужно создать свой собственный класс POCO IUser и реализовать свой IUserStore для вашего пользовательского класса IUser в версии RTM версии 1.0.
Это то, что у нас не было времени для поддержки, но сейчас я изучаю это легко (ier) в 1.1. Надеюсь, что кое-что будет доступно в ночных сборках в ближайшее время.
Обновлен с примером 1.1-alpha1: Как получить ночные builts
Если вы обновляетесь до последних ночных бит, вы можете попробовать новый 1.1-alpha1 apis, который должен сделать это проще сейчас: здесь то, что включает в себя Гиды вместо строк, должно выглядеть, например,
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);
}
}