Identity UserManager.AddToRole抛出exception

正如标题所说,我正在使用新的C# MVC 5 Identity进行简单的调用:

 UserManager.AddToRole(User.Id, User.RequestedRole); 

我在从ViewModel调用的ViewModel方法中执行此操作

UserManager是在我的ViewModelBase 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 } 

有关详细信息,请参阅我的TMUserLedger对象的结构:

 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的原因)。