UserManager.AddToRole不工作 - 外键错误 [英] UserManager.AddToRole not working - Foreign Key error
问题描述
在我的ASP.NET MVC应用程序,我有一些code这应该是相当微不足道的:
In my ASP.NET MVC application I have some code which should be fairly trivial:
UserManager.AddToRole(user.id, "Admin");
我刚刚得到这个错误...
I just get this error...
INSERT语句冲突与外键约束
FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId。该冲突发生
数据库TestDatabase,表dbo.AspNetRoles,列ID。
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId". The conflict occurred in database "TestDatabase", table "dbo.AspNetRoles", column 'Id'.
我的ASP.NET身份框架是,一切都使用自定义的Guid
作为键,而不是 INT
或字符串
。
My ASP.NET Identity Framework is custom in that everything uses Guid
as keys instead of int
or string
.
任何想法是什么原因造成的?
Any ideas what is causing this?
编辑,根据用户的意见...
用户级
public class User : IdentityUser<Guid, UserLogin, UserRole, UserClaim>
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public override Guid Id
{
get { return base.Id; }
set { base.Id = value; }
}
}
角色类
public class Role : IdentityRole<Guid, UserRole>
{
public const string Admininstrator = "Administrator";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public new Guid Id { get; set; }
}
的UserRole类
public class UserRole : IdentityUserRole<Guid>
{
}
internal class RoleManager : RoleManager<Role, Guid>
{
public RoleManager(IRoleStore<Role, Guid> roleStore) : base(roleStore)
{
}
public static RoleManager Create(IdentityFactoryOptions<RoleManager> options, IOwinContext context)
{
return new RoleManager(new RoleStore(context.Get<ApplicationDataContext>()));
}
}
SignInManager类
internal class SignInManager : SignInManager<User, Guid>
{
public SignInManager(UserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager)
{
}
public override Task<ClaimsIdentity> CreateUserIdentityAsync(User user)
{
return user.GenerateUserIdentityAsync((UserManager)UserManager);
}
public static SignInManager Create(IdentityFactoryOptions<SignInManager> options, IOwinContext context)
{
return new SignInManager(context.GetUserManager<UserManager>(), context.Authentication);
}
}
的UserManager类
internal class UserManager : UserManager<User, Guid>
{
public UserManager(IUserStore<User, Guid> store) : base(store)
{
}
public static UserManager Create(IdentityFactoryOptions<UserManager> options, IOwinContext context)
{
var manager = new UserManager(new UserStore<User, Role, Guid, UserLogin, UserRole, UserClaim>(context.Get<ApplicationDataContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<User, Guid>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Configure user lockout defaults
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
manager.MaxFailedAccessAttemptsBeforeLockout = 5;
// Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug it in here.
manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<User, Guid>
{
MessageFormat = "Your security code is {0}"
});
manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<User, Guid>
{
Subject = "Security Code",
BodyFormat = "Your security code is {0}"
});
manager.EmailService = new EmailService();
manager.SmsService = new SmsService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<User, Guid>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}
Rolestore的类
internal class RoleStore : RoleStore<Role, Guid, UserRole>
{
public RoleStore(DbContext context) : base(context)
{
}
}
更新1:
罪魁祸首就在这里...
The culprit lies here...
public class Role : IdentityRole<Guid, UserRole>
{
public const string Admininstrator = "Administrator";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public new Guid Id { get; set; }
}
... ...特别
...specifically...
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public new Guid Id { get; set; }
我这替代了肮脏的黑客,它的工作原理
public Role()
{
Id = Guid.NewGuid();
}
如果这是任何人任何帮助吗?我个人preFER不要用肮脏的黑客!
If that's any help to anyone? personally I would prefer NOT to use a dirty hack!
推荐答案
替换
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public new Guid Id { get; set; }
用流利的API。在自定义的 IdentityDbContext
类添加
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// identity
modelBuilder.Entity<User>().Property(r=>r.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Role>().Property(r=>r.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
这篇关于UserManager.AddToRole不工作 - 外键错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!