Entity framework 附着处于修改状态的实体,而不将所有属性标记为脏

Entity framework 附着处于修改状态的实体,而不将所有属性标记为脏,entity-framework,entity-framework-4.1,ef-code-first,Entity Framework,Entity Framework 4.1,Ef Code First,我试图找出如何将分离实体的特定属性标记为已修改。如果我执行以下操作,它将标记所有已修改的属性,生成的sql将更新所有列 /// <summary> /// Sets the entity in the modified state. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity">The entity.</param>

我试图找出如何将分离实体的特定属性标记为已修改。如果我执行以下操作,它将标记所有已修改的属性,生成的sql将更新所有列

/// <summary>
/// Sets the entity in the modified state.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity">The entity.</param>
void IDbContext.Modified<T>(T entity)
{
    DbEntityEntry<T> entry = Entry(entity);
    if (entry.State == EntityState.Modified)
    {
        // if the state is already Modified we don't need to do anything else
        return;
    }

    if (entry.State == EntityState.Detached)
    {
        Set<T>().Attach(entity);

        //TODO: set specific properties modified instead of the the whole object.
        entry.State = EntityState.Modified;
    }
}

必须通过调用以下命令手动为每个属性执行此操作:

DbEntityEntry<T> entry = context.Entry(entity);
if (entry.State == EntityState.Detached)
{
    context.Set<T>().Attach(entity);
    entry.Property(e => e.SomeProperty).IsModified = true;
    // TODO other properties
}
DbEntityEntry=context.entry(实体);
if(entry.State==EntityState.Detached)
{
context.Set().Attach(实体);
entry.Property(e=>e.SomeProperty).IsModified=true;
//TODO其他属性
}
编辑:

前一个示例假设您不想从数据库中重新加载实体,在这种情况下,您必须知道哪些属性发生了更改—由您来实现它

如果您对数据库的其他查询感到满意,可以使用以下方法:

var persistedEntity = context.Set<T>.Find(key);
var entry = context.Entry(persistedEntity);
entry.CurrentValues.SetValues(entity);
var persistedEntity=context.Set.Find(键);
var entry=context.entry(persistedEntity);
entry.CurrentValues.SetValues(实体);
编辑2:

设置原始值应该是反向操作(但我从未尝试过):

var persistedEntity=context.Set.Find(键);
context.Entry(persistedEntity).State=EntityState.Detached;
var条目=上下文条目(实体);
context.Set.Attach(实体);
//我不确定您是否必须更改实体的状态
entry.OriginalValues.SetValues(持久性);

如何确定修改了哪些属性?我可以从数据库中检索当前值并让状态管理器解决它吗?@Ladislav:问题表明所有属性都被标记为已修改。您正在演示如何将单个属性标记为已修改,这在这里是多余的。@Scott:我知道OP不想将所有属性标记为已修改。@Ladislav:我认为您的答案的关键是不要直接设置实体的状态(如在问题中)而是通过已更改的属性。@Scott:如果是这样,答案是:对分离的实体进行更改时不可能,因为上下文不知道它们。这仅适用于附着/跟踪的实体,并且在更改属性后会自动执行。
var persistedEntity = context.Set<T>.Find(key);
var entry = context.Entry(persistedEntity);
entry.CurrentValues.SetValues(entity);
var persistedEntity = context.Set<T>.Find(key);
context.Entry(persistedEntity).State = EntityState.Detached;

var entry = context.Entry(entity);
context.Set<T>.Attach(entity);
// I'm not sure if you have to change the state of the entity
entry.OriginalValues.SetValues(persistedEntity);