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

5
我找到了解决方案:
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();

我该如何进行更新?

3个回答

6

回复晚了,但我认为这会对社区有所帮助。 将您的更新方法更改为以下内容:

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

0

你可能需要使用ApplyChanges方法:

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

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


我没有使用自跟踪实体... 嗯... 但是ApplyChanges方法应该来自上下文... 不管我们使用什么类型的实体,它都应该起作用... 你在使用什么类型的上下文? - jojo
嗯,我进行了一些调查,“ApplyChanges”方法是随自跟踪实体模板提供的扩展方法。它在更新期间处理实体的“跟踪”。那么抱歉,我会再仔细研究一下。 - tobias86
它有一些小问题,但它确实有所帮助 :) - tobias86

0

或许 Attach 方法可以帮到你?请查看这篇文章以获取更多信息。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接