首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >附加处于已修改状态的实体,而不将所有属性标记为脏

附加处于已修改状态的实体,而不将所有属性标记为脏
EN

Stack Overflow用户
提问于 2011-07-26 20:25:20
回答 1查看 10.7K关注 0票数 11

我正在尝试弄清楚如何将分离实体的特定属性标记为已修改。如果我执行以下操作,它将标记所有属性已修改,并且生成的sql将更新所有列。

代码语言:javascript
运行
复制
/// <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。在我当前的实现中,修改后的方法不知道实体类型,所以我不能简单地用context.Set<T>.Find(key)检索它。

我想我可以添加一个接受originalEntity参数的重载,但如果可能的话,我不希望这样做。

代码语言:javascript
运行
复制
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);
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2011-07-26 20:27:48

您必须手动为每个属性执行此操作,方法是调用:

代码语言:javascript
运行
复制
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
}

编辑:

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

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

代码语言:javascript
运行
复制
var persistedEntity = context.Set<T>.Find(key);
var entry = context.Entry(persistedEntity);
entry.CurrentValues.SetValues(entity);

Edit2:

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

代码语言:javascript
运行
复制
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);
票数 17
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6829962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档