c# - 我可以将对象分配给实体对象吗?

标签 c# entity-framework-4

我正在使用 ASP.NET MVC4 Web API 和我的 PUT 操作,我想做这样的事情:

public void Put(string id, [FromBody]Foo value)
{
    var context = new FooBarEntities();
    Foo existingFoo = context.Foos.Where(x => x.Id == id).First();
    existingFoo = value;
    context.SaveChanges();
}

但是 Foo value 对象中的更改没有保存。如果我要做每个属性,它会像这样工作:

public void Put(string id, [FromBody]Foo value)
{
    var context = new FooBarEntities();
    Foo existingFoo = context.Foos.Where(x => x.Id == id).First();
    existingFoo.Prop1 = value.Prop1;
    existingFoo.Prop2 = value.Prop2;
    context.SaveChanges();
}

有没有一种方法可以通过分配对象来更新每个属性?

最佳答案

这绝对行不通:

Foo existingFoo = context.Foos.Where(x => x.Id == id).First();
existingFoo = value;

您正在查找它,然后立即用完全不同的内容覆盖引用。

我认为您想将附加您的到上下文,然后进行保存。更多 like this可能会为你做:

context.Foos.AddObject(value);
context.ObjectStateManager.ChangeObjectState(value, System.Data.EntityState.Modified);
context.SaveChanges();

这不需要您首先加载要更新的对象,这很好。如果这样做不行,那么知道这称为 disconnected 之类的更新可能有助于您 future 的谷歌搜索。

如果您手头已有要更新的对象以及新副本,我不知道有什么干净的东西可以为您合并它们。


另一种方式I've done it before 看起来更像是这样,这可能感觉不那么骇人听闻:

var entity = context.Entry(value);
entity.State = EntityState.Modified;
context.SaveChanges();

或者更简洁:

context.Entry(value).State = EntityState.Modified;
context.SaveChanges();

不过,我不记得那是不是内置的东西。

关于c# - 我可以将对象分配给实体对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107179/

相关文章:

c# - 在 VS 中运行单元测试与调试单元测试时,我应该期待什么区别?

c# - 如何为来自不同公司的断开连接的系统同步两个数据库

.net - Entity Framework 4 错误 : Unable to update the EntitySet because it has a DefiningQuery

c# - 如何从 EF 4 中的相关表中删除行?

WPF 绑定(bind)到 Entity Framework 不更新

c# - 无法通过 C# MVC 网站登录 Garmin

c# 将类转换为查询字符串

c# - 从 aspx 站点请求另一个页面

asp.net-mvc-2 - 部署 SQLCE.EntityFramework 4.0.8435.1

c# - 为什么 ObjectContext.DetectChanges 不将 State 重置为 Unchanged?