繁体   English   中英

身份UserManager.AddToRole引发异常

[英]Identity UserManager.AddToRole throws exception

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

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

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

在我的ViewModelBase Class中创建UserManager ,如下所示:

UserManager = new UserManager<TMUser>(new UserStore<TMUser>(new TMContext()));

当我对AddToRole方法进行上述调用时,我收到此Inner Exception (外部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 Context类中,我的是: 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来继续前进,但是那会很欺骗...我真的不想受到它的束缚...请帮助...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM