Identity UserManager.AddToRole抛出exception
正如标题所说,我正在使用新的C#
MVC 5
Identity
进行简单的调用:
UserManager.AddToRole(User.Id, User.RequestedRole);
我在从ViewModel
调用的ViewModel
方法中执行此操作
UserManager
是在我的ViewModel
的Base Class
中创建的,如下所示:
UserManager = new UserManager(new UserStore(new TMContext()));
当我对AddToRole
方法进行上述调用时,我得到了这个Inner Exception
(外部的是通用的/无用的):
{"A relationship from the 'Ledger_User' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Ledger_User_Source' must also in the 'Deleted' state."}
我显然没有删除任何内容,只是添加了一个角色给我的用户。 在我尝试从多个上下文中混合对象之前,我遇到了这个exception……但我在这里没有这样做…请帮助。
编辑:我已经摆脱了模型,以防它干扰并将以下代码添加到我的控制器:
public ActionResult UpdateRoles(string id) { if (ModelState.IsValid) { var userManager = new UserManager(new UserStore(new TMContext())); var userRequestingRole = userManager.FindById(id); if (!userManager.IsInRole(userRequestingRole.Id, userRequestingRole.RequestedRole)) userManager.AddToRole(userRequestingRole.Id, userRequestingRole.RequestedRole); // It is still crashing with the same error in the above AddToRole }
有关详细信息,请参阅我的TMUser
和Ledger
对象的结构:
public class TMUser : IdentityUser { public TMUser() { Ledger = new Ledger(); OrderHistory = new List(); Clients = new List(); IsActive = true; } [DisplayName("Full Name")] public string FullName { get; set; } [DisplayName("Notification Email")] public string NotificationEmail { get; set; } public virtual Ledger Ledger { get; set; } public virtual List OrderHistory { get; set; } public virtual List Clients { get; set; } public string RequestedRole { get; set; } public virtual TMUser RoleApprovedBy { get; set; } public bool IsActive { get; set; } } public class Ledger { public Ledger() { Transactions = new List(); } public long Id { get; set; } [Required] public virtual TMUser User { get; set; } public virtual List Transactions { get; set; } public decimal GetBalance() { // ... } internal void AddTransaction(decimal amount, string description, Order order) { // ... } }
另一个编辑:今天又是令人沮丧的一天。 在我的Context
做了一些更改后,最初似乎我解决了问题。 这是我做的改变:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().HasOptional(c => c.RoleApprovedBy); modelBuilder.Entity().HasOptional(c => c.Ledger); }
我将上面的内容添加到DB Context类中,我的是: public class TMContext : IdentityDbContext
这是第一次工作,我一定打破了某种关联? 但是,当我再次尝试使用不同的用户时,发生了类似但略有不同的Exception
:
{"A relationship from the 'TMUser_Ledger' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'TMUser_Ledger_Target' must also in the 'Deleted' state."}
所以感觉就像我回到原点……我可以继续从User
对象中移除Ledger
,但那会欺骗……我真的不想得到它的hacky …请帮助…
问题是您在TMUser的构造函数中创建了一个新的Ledger,当您这样做时,您将删除TMUser的当前分类帐并将其替换为新的空分类帐。 然后,EF将处理新的Ledger作为需要插入数据库的新对象。 这就是为什么你得到关于被删除状态的实体的validation错误。
在TMUser的构造函数中创建新Ledger的另一个原因是每个TMUser都有一个分类帐,但在数据库模型中,您已将其设置为可为空(由于HasOptional的原因)。
- 如何在aspnet身份中进行会话管理?
- ASP.NET 5 MVC6 User.GetUserId()返回错误的id
- InvalidOperationException:无法为“Role”创建DbSet,因为此类型未包含在上下文的模型中
- SignInManager,它是什么以及如何使用?
- IDbSet 上没有FindAsync()方法
- ASP.NET身份提供程序SignInManager保持返回失败
- Owin Authentication.SignIn不工作
- OWIN OpenID提供程序 – GetExternalLoginInfo()返回null
- 如何解决ASP.NET MVC Kendo UI网格中的CRUD操作问题