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
是在myViewModel的基类中创建的,如下所示:
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."}