使用 ASP.Net Identity EntityFramwork 到现有 AspNetUsers table,ID 列设置为 UniqueIdentifier
Using ASP.Net Identity EntityFramwork to Existing AspNetUsers table with ID Column set to UniqueIdentifier
我正在使用 Nuget 包 Microsoft.AspNet.Identity.EntityFramework 并连接到现有的 SQL 服务器数据库,其中 AspNetUsers table ID 列设置为 UniqueIdentifier。
执行调用以获取用户时,出现错误:
无法将 'IdentityUser`4' 上的 'Id' 属性 设置为 'System.Guid' 值。您必须将此 属性 设置为 'System.String' 类型的 non-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 变量并检查用户 属性.
时,我看到了错误
更新:
我在这里(在标题部分)找到了一些信息:
Make the Type of Primary Key Be Extensible for Users and Roles
但我不确定如何正确实施。我需要添加一个新的 class 吗?我对那里的实现很模糊。
实际上,是的,您必须实现自己的 IdentityUser
class。默认情况下,Identity Framework IdentityUser
id 的类型为 string
,这并不总是可以接受的。因此,您可以执行以下操作:
public sealed class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
其中 int
是用户 ID 的类型。如果你想使用你的自定义 UserLogin
、UserRole
或 UserClaim
(默认情况下它们的 id 也是 stings,所以你可能也想这样做)那么你必须添加你的自定义继承class是:
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
接下来您要做的是使用您的自定义实体 class,由 Identity、managers(如 UserManager
或 SignInManager
)提供:
public class ApplicationUserManager : UserManager<User, int> {}
public class ApplicationSignInManager : SignInManager<User, int> {}
其中 User
类型是您的自定义 User : IdentityUser<int, UserLogin, UserRole, UserClaim>
(上面已解释),int
是 id 类型。因此,简而言之,基本思想是使用您自己的实现继承默认身份类型,并在身份使用其默认类型的地方使用它们。这是可以的做法。在你的情况下,我建议, UniqueIdentifier
是一些自定义类型,所以你必须使用这种类型而不是 int
(比如 in example you provided):
public sealed class User : IdentityUser<UniqueIdentifier, UserLogin, UserRole, UserClaim>
我正在使用 Nuget 包 Microsoft.AspNet.Identity.EntityFramework 并连接到现有的 SQL 服务器数据库,其中 AspNetUsers table ID 列设置为 UniqueIdentifier。
执行调用以获取用户时,出现错误:
无法将 'IdentityUser`4' 上的 'Id' 属性 设置为 'System.Guid' 值。您必须将此 属性 设置为 'System.String' 类型的 non-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 变量并检查用户 属性.
时,我看到了错误更新: 我在这里(在标题部分)找到了一些信息:
Make the Type of Primary Key Be Extensible for Users and Roles
但我不确定如何正确实施。我需要添加一个新的 class 吗?我对那里的实现很模糊。
实际上,是的,您必须实现自己的 IdentityUser
class。默认情况下,Identity Framework IdentityUser
id 的类型为 string
,这并不总是可以接受的。因此,您可以执行以下操作:
public sealed class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
其中 int
是用户 ID 的类型。如果你想使用你的自定义 UserLogin
、UserRole
或 UserClaim
(默认情况下它们的 id 也是 stings,所以你可能也想这样做)那么你必须添加你的自定义继承class是:
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
接下来您要做的是使用您的自定义实体 class,由 Identity、managers(如 UserManager
或 SignInManager
)提供:
public class ApplicationUserManager : UserManager<User, int> {}
public class ApplicationSignInManager : SignInManager<User, int> {}
其中 User
类型是您的自定义 User : IdentityUser<int, UserLogin, UserRole, UserClaim>
(上面已解释),int
是 id 类型。因此,简而言之,基本思想是使用您自己的实现继承默认身份类型,并在身份使用其默认类型的地方使用它们。这是可以的做法。在你的情况下,我建议, UniqueIdentifier
是一些自定义类型,所以你必须使用这种类型而不是 int
(比如 in example you provided):
public sealed class User : IdentityUser<UniqueIdentifier, UserLogin, UserRole, UserClaim>