2015-01-09 2 views
2

Я использую пакет Nuget Microsoft.AspNet.Identity.EntityFramework и подключение к существующей базе данных SQL Server, где столбец ID таблицы AspNetUsers задан как UniqueIdentifier.Использование ASP.NET Identity EntityFramwork для существующей таблицы AspNetUsers с идентификационной колонкой, установленной на UniqueIdentifier

При выполнении вызова, чтобы получить пользователь, я получаю сообщение об ошибке:

Свойства «Id» на «IdentityUser`4» не может быть установлен в значение «System.Guid». Вы должны установить это свойство в ненулевое значение типа «System.String».

Есть ли способ установить свойство Id в коде, поскольку я не могу изменить свойство столбца в моей базе данных.

Вот мои фрагменты кода:

AuthProvider.cs

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override async Task GrantCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
    using(Repository _repo = new Repository()) 
    { 
     IdentityUser user = await _repo.FindUser(context.UName, context.PWord); 
     if(user == null) 
     { 
     // User Not Found/Invalid UName or PWord. 
     } 
    } 
    } 
} 

Repository.cs

public class Repository : IDisposable 
{ 
    private AppContext _ctx; 
    private UserManager<IdentityUser> _usrMgr; 

    public Repository() 
    { 
    _ctx = new AppContext(); 
    _usrMgr = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx)); 
    } 

    public async Task<IdentityUser> FindUser(string uName, string pWord) 
    { 
    // Setting the breakpoint here in this line below: 
    IdentityUser usr = await _usrMgr.FindAsync(uName, pWord); 
    return user; 
    } 
} 

На контрольной точке я настроил на Repository.cs , Я вижу ошибку, когда я расширяю переменную _usrMgr и проверяю свойство Users.

Update: Я нашел несколько битов информации здесь (в разделе под названием):

Make the Type of Primary Key Be Extensible for Users and Roles

, но я не уверен в том, как реализовать это правильно. Нужно ли добавлять новый класс? Реализация там довольно неопределенная в моем понимании.

ответ

5

На самом деле, да, вы должны реализовать свой собственный класс IdentityUser. По умолчанию в Identity Framework IdentityUser id имеет тип string, что не всегда приемлемо. Таким образом, вы можете сделать следующее:

public sealed class User : IdentityUser<int, UserLogin, UserRole, UserClaim> 

где int является тип идентификатора пользователя. Если вы хотите использовать пользовательские UserLogin, UserRole или UserClaim (по умолчанию их идентификаторы также укусы, так что вы, вероятно, также хотят, чтобы сделать это), то вы должны добавить свои собственные наследственные классы:

public class UserRole : IdentityUserRole<int> { } //int is id type 
public class UserClaim : IdentityUserClaim<int> { } //int is id type 
public class UserLogin : IdentityUserLogin<int> { } //int is id type 

Следующая то, что что вы хотите сделать, это использовать пользовательские классы сущностей всего, обеспечивается идентичность, менеджеры (как UserManager или SignInManager):

public class ApplicationUserManager : UserManager<User, int> {} 
public class ApplicationSignInManager : SignInManager<User, int> {} 

где User тип ваш заказ User : IdentityUser<int, UserLogin, UserRole, UserClaim> (описано выше) и int тип id. Итак, в двух словах основная идея состоит в том, чтобы наследовать типы идентификаторов по умолчанию с вашими собственными реализациями и использовать их там, где Identity использует свои типы по умолчанию. Это нормально. В вашем случае, я полагаю, UniqueIdentifier некоторый пользовательский тип, так что вы должны использовать этот тип вместо int (как in example you provided):

public sealed class User : IdentityUser<UniqueIdentifier, UserLogin, UserRole, UserClaim> 
Смежные вопросы