使用通用存储库更新实体失败

sch*_*eck 1 c# asp.net-mvc entity-framework repository asp.net-mvc-4

我有一个通用存储库:

    public class GenericRepository<TEntity> : AbstractRepository<TEntity>, IRepository<TEntity> where TEntity : class
    {
        private DbContext _context;
        [...]
        public GenericRepository(DbContext context)
        {
            _context = context;
            context.Configuration.AutoDetectChangesEnabled = true;
            _dbSet = _context.Set<TEntity>();
        }
        [...]
        public void SaveChanges()
        {
            _context.SaveChanges();
        }
        [...]
    public void Add(TEntity entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }

        _dbSet.Add(entity);
    }
        [...]
    public virtual void Update(TEntity entity)
    {
        _context.Entry(entity).State = EntityState.Modified;
    }
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,有以下代码:

    [HttpPost]
    public ActionResult Edit(Project project)
    {
          if (ModelState.IsValid)
        {
            if (project.Id == 0)
            {
                ProjectRepository.Add(project);
            }
            else
            {
                ProjectRepository.Update(project);
            }

            ProjectRepository.SaveChanges();
            [...]
Run Code Online (Sandbox Code Playgroud)

选择和插入工作正常,但不更新:我得到一个 InvalidOperationException(德语错误消息的英文翻译是“对象状态管理器中已经存在具有相同键的对象。对象状态管理器无法跟踪多个具有相同键的对象钥匙。”)。

我不明白,因为我是我开发机器上的唯一用户,我没有在其他地方修改记录。

知道我在这里做错了什么吗?

Gar*_*ger 6

看看这些答案:

基本上你需要这样做:

 var entity = _context.Projects.Find(project.ProjectId);
 _context.Entry(entity).CurrentValues.SetValues(project);
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助。