entity-framework - 附加处于修改状态的实体而不将所有属性标记为脏

标签 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>
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;
    }
}

如何仅将更改的属性设置为已修改?

我试图在实现 DbContext 的类中使用它将由通用存储库使用。目标是自动确定与数据库值相比哪些属性发生了更改,然后将这些更改的属性状态设置为 Modified。在我当前的实现中,Modified 方法不知道实体类型,所以我不能简单地用 context.Set<T>.Find(key) 检索它。 .

我想我可以添加一个接受 originalEntity 的重载参数,但如果可能的话,我宁愿不要。
void IDbContext.Modified<T>(T entity, T originalEntity)
{
    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);

        entry.OriginalValues.SetValues(originalEntity);
    }
}

最佳答案

您必须通过调用手动为每个属性执行此操作:

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
}

编辑:

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

如果您对数据库的附加查询感到满意,则可以使用以下命令:
var persistedEntity = context.Set<T>.Find(key);
var entry = context.Entry(persistedEntity);
entry.CurrentValues.SetValues(entity);

编辑2:

设置原始值应该是反向操作(但我从未尝试过):
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);

关于entity-framework - 附加处于修改状态的实体而不将所有属性标记为脏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829962/

相关文章:

inheritance - Entity Framework +多级继承+EF代码优先

entity-framework - 在 EF 4.3 中使用参数执行存储过程时,对象类型 System.Collections.Generic.List 不存在映射

c# - Web api 在本地工作但在部署到 Azure 时不起作用

entity-framework - Entity Framework 数据库开发入门(代码优先)

sql-server - Entity Framework 迁移 - 更改属性数据类型

c# - 设计师问题 + Entity Framework (WPF MVVM)

c# - Entity Framework 选择查询

entity-framework - Entity Framework 6.1 将我的数据库放在哪里?

entity-framework - 使 byte[] 属性延迟加载

c# - 如何在 Entity FrameWork 中存储特定的 float