正如标题所说,我正在使用新C#
MVC 5
Identity
进行简单的通话:
UserManager.AddToRole(User.Id, User.RequestedRole);
我是通过ViewModel
Controller
方法执行此操作的
我的UserManager
Base Class
中创建了ViewModel
,如下所示:
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
}
有关详细信息,请参阅我的TMUser
和Ledger
个对象的结构:
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."}
所以感觉我回到原点...我可以通过从Ledger
对象中移除User
继续前进,但那会欺骗......我真的不喜欢&#39我想得到它的hacky ...请帮助...
答案 0 :(得分:2)
问题是您在TMUser的构造函数中创建了一个新的Ledger,当您这样做时,您将删除TMUser的当前分类帐并将其替换为新的空分类帐。然后,EF将处理新的Ledger作为需要插入数据库的新对象。这就是为什么你得到关于被删除状态的实体的验证错误。
在TMUser的构造函数中创建新Ledger的另一个原因是每个TMUser都有一个分类帐,但在您的数据库模型中,您已将其设置为可为空(由于HasOptional的原因)。