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

标签 c# entity-framework

<分区>

我是 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 将确定该实体已更新。 (只要您没有禁用 AutoTracking)

借用 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,您将需要

  1. 将您的实体附加到一个新的(或您当前的)DbContext (如果您设置了 EntityState.Modified,这将自动为您完成)
  2. 告诉 DbContext 这个实体已经被修改了
  • var entry = context.Entry(entity);//获取上下文中实体的条目
  • entry.State = EntityState.Modified;//告诉 Entity Framework 这个实体已经被修改
  1. 可选告诉 EF 您的实体上的哪些属性已被修改
  2. 调用 SaveChanges()

关于c# - 在 Entity Framework 中更新实体的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28932621/

相关文章:

c# - EF 迁移显示空的 Up() Down() 方法

c# - 使用 ManagedWifi 在 c# 中连接到 wifi

c# - 在窗体内打开应用程序 - C# 或 VB.NET

c# - 英孚流利 API : Set property for each entity derived from a base abstract class

c# - 无效的列名 C#

asp.net-mvc-3 - 如何设置新的成员资格和 session 提供程序以在 Windows Azure 中运行?使用 MVC3 和 Web 角色

c# - 如何指向不同环境的 Entity Framework 数据库上下文

c# - Kinect V2 颜色流字节顺序

c# - 使用 ASP.Net 5 进行 JwtBearer 身份验证

c# - Entity Framework 。多个 DbContext 多个数据库。 MySQL。代码优先