身份UserManager.AddToRole抛出异常

本文关键字:抛出异常 AddToRole UserManager 身份 | 更新日期: 2023-09-27 18:03:20

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

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

我在ViewModel的方法中这样做,该方法是从Controller

调用的

UserManager是在我的ViewModelBase Class中创建的,像这样:

UserManager = new UserManager<TMUser>(new UserStore<TMUser>(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."}

我显然没有删除任何东西,只是给我的用户添加了一个角色。我有这个例外之前,当我试图从多个上下文混合对象…但我不会在这里这么做…请帮助。

编辑:

我已经摆脱了模型,以防它干扰并添加以下代码到我的控制器:

    public ActionResult UpdateRoles(string id)
    {
        if (ModelState.IsValid)
        {
            var userManager = new UserManager<TMUser>(new UserStore<TMUser>(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<Order>();
        Clients = new List<Client>();
        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<Order> OrderHistory { get; set; }
    public virtual List<Client> 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<Transaction>();
    }
    public long Id { get; set; }
    [Required]
    public virtual TMUser User { get; set; }
    public virtual List<Transaction> 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<TMUser>().HasOptional(c => c.RoleApprovedBy);
    modelBuilder.Entity<TMUser>().HasOptional(c => c.Ledger);
}

我将上述内容添加到DB上下文类中,我的是:public class TMContext : IdentityDbContext<TMUser>

第一次就成功了,我一定是打破了某种联系?然而,当我用不同的用户再次尝试时,出现了类似但略有不同的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,但这将是作弊……我真的不想把它弄得很粗糙。请帮助…

身份UserManager.AddToRole抛出异常

问题是您在TMUser的构造函数中创建了一个新的分类帐,当您这样做时,您将删除TMUser的当前分类帐并将其替换为一个新的空分类帐。然后,EF将把新的分类帐作为需要插入数据库中的新对象来处理。这就是为什么你得到关于一个处于已删除状态的实体的验证错误。

在TMUser的构造函数中创建新分类帐的另一个原因是,每个TMUser都有一个分类帐,但在您的数据库模型中,您已将其设置为可空(因为HasOptional)。