【发布时间】:2014-03-03 12:26:27
【问题描述】:
我正在使用 Entity Framework 6,我正在编写一个 Save 方法来更新现有“案例”的详细信息,如下所示:
public void Save(User user, Case @case)
{
if (@case.Id == 0)
{
// deal with new case scenario
}
else
{
var existing = GetCase(@case.Id);
// update existing's properties with those in @case
context.Entity(existing).State = EntityState.Modified;
context.Entry(existing.SubEntity1).CurrentValues.SetValues(@case.SubEntity1);
context.Entry(existing.SubEntity2).CurrentValues.SetValues(@case.SubEntity2);
}
context.SaveChanges();
}
Case 类型有一个名为 RaisedBy 类型为 User 的属性,该属性派生自 ASP.NET Identity 的 IdentityUser。
当调用GetCase 时,我使用IQueryable.Include 同时加载附加到RaisedBy 属性的用户。它似乎将User 作为代理加载,调试时的手表显示类型为System.Data.Entity.DynamicProxies.User_,后跟一个看起来像哈希的非常长的值。
当context.SaveChanges() 被调用时,EF 似乎会尝试将用户重新写入表,从而产生带有消息的DbUpdateException:
违反主键约束“PK_dbo.IdentityUsers”。无法在对象“dbo.IdentityUsers”中插入重复键。重复键值为 (0799b4c2-a38e-430c-8031-1c27878f2f43)。 声明已终止。
据我所知,RaisedBy 用户与从上下文中加载的用户完全相同,所以我很难看出问题是如何蔓延的。
【问题讨论】:
-
@case被跟踪了吗? -
@case未被跟踪,它是Case的实例,其中包含我想要对existing进行的更改,已被跟踪。
标签: entity-framework primary-key dbcontext asp.net-identity