c# - 在 Entity Framework 中更新实体的最佳方法

标签 c# entity-framework

这个问题在这里已经有了答案:





Entity Framework 5 Updating a Record

(8 个回答)


6年前关闭。




我是 Entity Framework 的新手,我使用的是 Nhibernate。在 Nhibernate 中更新对象不需要传递 id,您只需传递实体,Nhibernate 自己匹配 id 并更新实体。在 EF 我使用这种方法:

        protected virtual bool UpdateEntity(TEntity entity, int id)
        {
          using (var ctx = new GenericContext())
          {
              var list = ctx.Set<TEntity>().ToList();
              ctx.Entry<TEntity>(ctx.Set<TEntity>  ().Find(id)).CurrentValues.SetValues(entity);
              return ctx.SaveChanges() > 0;
        }
       }
这需要 id 来更新实体。这是最好的方法吗?有没有办法通过传递实体而不首先找到它来更新实体?

最佳答案

这取决于您是否启用了自动跟踪。默认情况下,这意味着您检索到的任何实体都将存储在 DbContext 中。您曾经检索它以及其原始值的副本。
那么如果你编辑这个实体,当你调用 DbContext.SaveChanges() , EF 将遍历你所有的实体,并将它们与它们的原始值进行比较,如果有任何变化,它将执行更新语句。
因此,如果您都检索实体、编辑它并想要保存它,所有这些都在同一个上下文的范围内。您只需调用contxt.SaveChanged()并且 EF 将确定该实体已更新。 (只要您没有禁用自动跟踪)
借用 Eriks 代码:

var ctx = new SchoolDBEntities() 

var student = ctx.Students.Where(s => s.Name == "John Doe").First();    

student.Name = "Erik Blessman";

ctx.SaveChanges(); // Will update the  student
否则,如果此实体是手动创建的且不属于任何 DbContexts你需要
  • 将您的实体附加到新的(或当前的)DbContext (如果您设置 EntityState.Modified,这将自动为您完成)
  • 告诉 DbContext此实体已被
  • 修改
  • var entry = context.Entry(entity); // Gets the entry for entity inside context
  • entry.State = EntityState.Modified; // Tell Entity Framework this entity has been modified
  • (可选)告诉 EF 您的实体上的哪些属性已被修改
  • 调用 SaveChanges()
  • 关于c# - 在 Entity Framework 中更新实体的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28932621/

    相关文章:

    c# - 如何建模这个实体

    sql-server - EF Code first,如何用不同的模式注册相同的表名?

    entity-framework - 未找到具有不变名称 'System.Data.SqlServerCe.4.0' 的 ADO.NET 提供程序的 Entity Framework 提供程序

    c# - 使用 DigitalPersona 4500 读取器进行指纹扫描。如何获取捕获的图像和加载事件处理程序

    c# - 将数据表写入数据库文件,一次一个记录

    c# - c#中64位应用程序中的32位dll

    c# - System.Exception 或只是 Exception

    c# - Entity Framework 6 : Clone object except ID

    c# - 模拟 DbContext.set<T>.Add() EF6

    asp.net - 如何使用 asp.net Core 更改迁移的输出文件夹?