如何更新 EF CF 中的实体对象(分离)?

Posted

技术标签:

【中文标题】如何更新 EF CF 中的实体对象(分离)?【英文标题】:How can i update an entity object (detach) in EF CF? 【发布时间】:2011-04-04 07:14:17 【问题描述】:

我找到了解决办法:

MyEntity tmp = ctx.Entities.Where<MyEntity>(t => t.Id == objectWithNewValues.Id).SingleOrDefault();
if (tmp != null)

    var entityInDb = ctx.Entry(tmp);
    entityInDb.CurrentValues.SetValues(objectWithNewValues);
    ctx.SaveChanges();

else

    throw new ArgumentException ...

在我使用 EF4 之前,从模式生成代码,上下文将有一个方法 "context.ApplyCurrentValue(entity)"

当我尝试更新分离对象时,我可以这样做:

void UpdateObject(Entity e)
    
     Entity tmp = ctx.Entities.Where(t=>t.id ==e.id);
     ctx.ApplyCurrentValue(e);
     ctx.SaveChannges();

现在我有一个使用 EF4 代码优先方法的项目,但我再也找不到“ApplyCurrentValue”方法了。

那么我该如何进行更新操作呢?

实体类是一个非常简单的类

public class MyEntity

    [Key]
    public Guid Id get;set;
    ...

我的上下文也是一个继承 DBContext 的非常简单的类

public MyContext : DBContext

    public DBSet<MyEntity> Entities get;set

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
        modelBuilder.Entity<MyEntity>().ToTable("tblMyEntity");
    

我正在尝试执行以下操作。但是值没有更新到数据库中!

ctx.entities.Attach(entity);
var entityInDb = ctx.Entry(entity);
entityInDb.CurrentValues.SetValues(entity);
context.SaveChanges();

如何进行更新?

【问题讨论】:

【参考方案1】:

回复较晚,但我认为这将有助于社区。 将您的更新方法更改为此

ctx.entities.Attach(entity);
var entry= ctx.Entry(entity);
entry.State = EntityState.Modified;
ctx.SaveChanges();

【讨论】:

【参考方案2】:

ApplyChanges 方法可能就是您所追求的:

model.ApplyChanges("Objects", object);
model.SaveChanges();
object.AcceptChanges();

注意:我们在 EF4 服务中使用自跟踪实体 T4 模板

【讨论】:

我没有使用自我跟踪实体......嗯......但是 ApplyChanges 方法应该来自上下文......我们使用什么样的实体应该很重要......什么你使用的conext类型? 嗯,我做了一些挖掘,“ApplyChanges”方法是自跟踪实体模板附带的扩展方法。它在更新期间处理实体的“跟踪”。那么抱歉,我会再挖掘一下。 这不是没有它的怪癖,但它确实有点帮助:)【参考方案3】:

也许 Attach 方法会有所帮助?查看this article 了解更多信息。

void UpdateObject(Entity e) 
  Entity tmp = ctx.Entities.Attach(e);
  ctx.SaveChannges();

【讨论】:

以上是关于如何更新 EF CF 中的实体对象(分离)?的主要内容,如果未能解决你的问题,请参考以下文章

无法更新EF6中的实体?

EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

在此示例中,如何强制 EF 仅更新 Db 中的一列?

EF 5 更新 N 级深度对象图?

更新子记录 EF Core 3.0 中的错误实体之间的关联已被切断,但关系被标记为“必需”

如何让所有实体访问:EDMX 中的内部而不是公共?