我正在使用Code First Entity Framework 4.1。我使用的两个实体是“State”和“User”。每个State条目都有一个“CreatedBy”用户和“ModifiedBy”用户属性,如下所示。
public class State {
public virtual User CreatedBy { get; set; }
public virtual User ModifiedBy { get; set; }
}
用户实体没有对State实体的任何反向引用,即State =>用户是“单向”。
当存在具有相同“CreatedBy”和“ModifiedBy”用户属性的分离状态实体时,会发生此问题。当我尝试将State Entity附加到dbContext时,EntityFramework会抱怨ObjectStateManager找到重复的条目。我正在为这个问题寻找一个简单的解决方案。
答案 0 :(得分:0)
一种解决方案是检查具有相同密钥的User
是否已在上下文中,如果是,则将User
实体中的分离State
引用替换为对象,附在上下文中。说,state
是要附加的新State
实体:
if (state.CreatedBy != null)
{
var attachedCreatedBy = context.ChangeTracker.Entries()
.Where(e => e.Entity is User
&& e.Cast<User>().Entity.Id == state.CreatedBy.Id)
.Select(e => e.Entity)
.SingleOrDefault();
if (attachedCreatedBy != null)
state.CreatedBy = attachedCreatedBy;
}
if (state.ModifiedBy != null)
{
var attachedModifiedBy = context.ChangeTracker.Entries()
.Where(e => e.Entity is User
&& e.Cast<User>().Entity.Id == state.ModifiedBy.Id)
.Select(e => e.Entity)
.SingleOrDefault();
if (attachedModifiedBy != null)
state.ModifiedBy = attachedModifiedBy;
}
context.States.Attach(state); // now it should not throw an exception anymore
好吧,我不会称之为“简单的解决方案”。但我不知道另一个。如果您在CreatedById
中拥有外键属性ModifiedById
和State
,则会变得更容易。您可以将导航属性CreatedBy
和ModifiedBy
设置为null
,并仅将外键属性设置为相关用户的ID。