c# - 实体不使用代码优先方法更新

标签 c# .net asp.net-mvc entity-framework ef-code-first

我有一个用于数据库操作的类:

public class EntityService<TEntity> : IRepository<TEntity> where TEntity : BaseModel
{

     ApplicationDbContext _context;
     private DbSet<TEntity> _entities;

     public EntityService()
     {
         _context = new ApplicationDbContext();
     }

     public virtual void Update(TEntity entity)
     {
          if (entity == null)
               throw new ArgumentNullException(nameof(entity));

          try
          {
                var dbEnt = _context.Set<TEntity>().Where(c => c.Id == entity.Id).First();

                dbEnt = entity;
                dbEnt.UpdatedBy = GetCurrentUser();
                dbEnt.DateUpdated = DateTime.Now;
                _context.SaveChanges();
           }
           catch (DbUpdateException exception)
           {
                throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
           }

           //-----other methods for insert and get working fine----
}

该类中还有其他用于insertget 的方法工作正常。只有这个更新方法不更新实体并且不抛出异常。

更新

我面临着类似的问题,但在这里运作相反:Add() method adding duplicate rows for linked models in Code-First Entity Framework

我认为这两者具有相同的更改跟踪原因。但是一个是添加另一个不是更新。

最佳答案

这条线...

var dbEnt = _context.Set<TEntity>().Where(c => c.Id == entity.Id).First();

...将实体对象附加到上下文并返回对此实体的引用。

然后这条线...

dbEnt = entity;

...将此引用替换为对进入方法的 entity 变量的引用。那是不是被跟踪的实体对象。您基本上丢失了对被跟踪实体的引用,并且不可能再更改它。

您应该将 entity 附加到上下文并将其标记为已修改,或者像您已经做的那样获取 dbEnt 并修改并保存 that目的。两种方法各有利弊,参见 here .

关于c# - 实体不使用代码优先方法更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302611/

相关文章:

c# - 有没有 .NET 多态数据框架

asp.net-mvc - Entity Framework 上下文 - 我卡住了!

c# - 整数除法

c# - 使用泛型和扩展方法将 DataTable 转换为 Dictionary<T1,T2>

c# - 如何避免从 F# 库返回 Task<Microsoft.FSharp.Core.Unit>

c# - 什么是 MVC future 库?

asp.net-mvc - 当旧文件仍然存在于目录中时 MVC Bundle {version}

c# - 如何将谓词作为参数传递#

c# - 从不同表中选择的休眠标准

.net - ServiceStack 中的自定义 JSON 序列化