使用相同的键附加分离的条目

时间:2011-08-15 07:15:45

标签: entity-framework-4.1 ef-code-first code-first

我正在使用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找到重复的条目。我正在为这个问题寻找一个简单的解决方案。

1 个答案:

答案 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中拥有外键属性ModifiedByIdState,则会变得更容易。您可以将导航属性CreatedByModifiedBy设置为null,并仅将外键属性设置为相关用户的ID。