我正在使用Nuget包Microsoft.AspNet.Identity.EntityFramework并连接到现有的SQL Server数据库,其中AspNetUsers表ID列设置为UniqueIdentifier。
当执行调用以获取用户时,我收到错误:
'IdentityUser`4'上的'Id'属性无法设置为'System.Guid'值。必须将此属性设置为“System.String”类型的非null值。
有没有办法在代码中设置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属性时,我看到了错误。
更新: 我在这里找到了一些信息(在标题为的部分):
Make the Type of Primary Key Be Extensible for Users and Roles
但我不确定如何正确实现这一点。我需要添加一个新课程吗?在我的理解中,那里的实施非常模糊。
答案 0 :(得分:5)
实际上,是的,你必须实现自己的IdentityUser
课程。默认情况下,在Identity Framework IdentityUser
中,id的类型为string
,但并不总是可以接受。因此,您可以执行以下操作:
public sealed class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
其中int
是用户ID的类型。如果您想使用自定义UserLogin
,UserRole
或UserClaim
(默认情况下,他们的ID也是蜇,所以您可能也想这样做)然后您必须添加自定义继承类:
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类型,并在Identity使用它的默认类型的地方使用它们。这是可以的做法。在您的情况下,我建议,UniqueIdentifier
是一种自定义类型,因此您必须使用此类型而不是int
(例如in example you provided):
public sealed class User : IdentityUser<UniqueIdentifier, UserLogin, UserRole, UserClaim>