Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Identity UserManager.AddToRole引发异常_C#_Asp.net Mvc 5_Asp.net Identity - Fatal编程技术网

C# Identity UserManager.AddToRole引发异常

C# Identity UserManager.AddToRole引发异常,c#,asp.net-mvc-5,asp.net-identity,C#,Asp.net Mvc 5,Asp.net Identity,正如标题所说,我正在使用新的C#mvc5Identity做一个简单的调用: UserManager.AddToRole(User.Id, User.RequestedRole); 我是通过我的ViewModel方法来执行此操作的,该方法是从控制器调用的 UserManager是在myViewModel的基类中创建的,如下所示: UserManager = new UserManager<TMUser>(new UserStore<TMUser>(new TMContex

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

UserManager.AddToRole(User.Id, User.RequestedRole);
我是通过我的
ViewModel
方法来执行此操作的,该方法是从
控制器调用的

UserManager
是在my
ViewModel的
基类中创建的,如下所示:

UserManager = new UserManager<TMUser>(new UserStore<TMUser>(new TMContext()));
很明显,我根本没有删除任何内容,只是向我的用户添加了一个角色。我以前在尝试混合来自多个上下文的对象时遇到过此异常…但我在这里没有这样做…请帮助

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

    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
        }
另一次编辑: 今天又是令人沮丧的一天。在我的
上下文中做了一些更改之后
一开始似乎解决了这个问题。以下是我所做的更改:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<TMUser>().HasOptional(c => c.RoleApprovedBy);

    modelBuilder.Entity<TMUser>().HasOptional(c => c.Ledger);
}

所以感觉我又回到了原点…我可以继续从
用户
对象中删除
分类账
,但那将是欺骗…我真的不想对其进行攻击…请帮助…

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


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

非常有意义,现在您已经解释过了。。。在这一点上感觉很无聊。。。感谢这是有道理的,这是胡说八道。任何普通ORM(NHibernate)都将创建对象,然后设置从DB加载的任何数据。如果您想要有一个对象模型,您不想总是检查某个对象是否为空(您决定这些对象必须存在,即使它们可能不在数据库中),那么上面的场景是必要的。这对任何做面向对象编码的人来说都是一个真正的挑战,所以:“万岁,EF又做了一次”。诀窍:我确实使用了一个受保护的默认ctor()[这是由EF使用的],然后在代码中使用静态Create方法,在这里我可以设置这些对象。
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)
    {
        // ...
    }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<TMUser>().HasOptional(c => c.RoleApprovedBy);

    modelBuilder.Entity<TMUser>().HasOptional(c => c.Ledger);
}
{"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."}