使用“实体框架” 6的存储库模式更新记录6



我正在编写一个简单的博客应用程序,并试图在我的通用存储库模式中建立CRUD操作,但是我在更新方法上遇到了一个错误,该方法说:

'system.data.entity.dbset'不包含适用的定义 "输入"而没有扩展方法的条目'接受第一个参数 可以找到'system.data.entity.dbset'的类型(您是否缺少一个 使用指令或汇编参考?)

我遵循了一篇文章,该帖子通过在dbcontext上添加其他间接级别来解释如何"伪造"条目()。但是,在MVC 5中,我们从: IdentityDbContext 而不是dbcontext继承。我确实尝试实现作者修复,但错误仍然存在。

我的问题

如何使用IdentityDbContext在"实体框架6"中的存储库中添加更新方法?如果我们不应该这样做,那么如何使用此模式更新记录?

我应该注意,所有其他方法都按预期工作。

我的通用存储库:

public class BlogEngineRepository<T> : IRepository<T> where T : class
    {
        protected DbSet<T> DbSet;
        public BlogEngineRepository(DbContext dataContext)
        {
            DbSet = dataContext.Set<T>();
        }
        #region IRepository<T> Members
        public void Insert(T entity)
        {
            DbSet.Add(entity);
        }
        public void Delete(T entity)
        {
            DbSet.Remove(entity);
        }
        public void Update(T entity)
        { 
           DbSet.Entry(entity).State = System.Data.Entity.EntityState.Modified;
        }
        public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
        {
            return DbSet.Where(predicate);
        }
        public IQueryable<T> GetAll()
        {
            return DbSet;
        }
        public T GetById(int id)
        {
            return DbSet.Find(id);
        }
        #endregion
    }

好吧,我想出了这一点。新存储库模式中没有 Update 方法的原因(实体框架6)是因为不需要一个。您只需通过ID获取记录,进行更改然后提交/保存。

例如
[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Edit([Bind(Include = "Id,Title,IntroText,Body,Modified,Author")] Post post)
{
    using (UnitOfWork uwork = new UnitOfWork())
    {
        Post edit = uwork.PostRepository.GetById(post.Id);
        edit.Title = post.Title;
        edit.IntroText = post.IntroText;
        edit.Body = post.Body;
        edit.Modified = DateTime.Now;
        uwork.Commit();
        return RedirectToAction("Index");
    }
}

repositorityPattern看起来像这样:

public class BlogEngineRepository<T> : IRepository<T> where T : class
{
    protected DbSet<T> DbSet;
    public BlogEngineRepository(DbContext dataContext)
    {
        DbSet = dataContext.Set<T>();
    } 
    public void Insert(T entity)
    {
        DbSet.Add(entity);
    }
    public void Delete(T entity)
    {
        DbSet.Remove(entity); 
    }
    public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where(predicate);
    }
    public IQueryable<T> GetAll()
    {
        return DbSet;
    }
    public T GetById(int id)
    {
        return DbSet.Find(id);
    } 
}

更新应该看起来像(扩展Dan Beaulieu的答案):

[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Edit([Bind(Include = "Id,Title,IntroText,Body,Modified,Author")] Post post)
{
    using (UnitOfWork uwork = new UnitOfWork())
    {
        post.Modified = DateTime.Now;
        uwork.PostRepository.Update(post);
        uwork.Commit();
        return RedirectToAction("Index");
    }
}

repositorityPattern看起来像这样:

public class BlogEngineRepository<T> : IRepository<T> where T : class
{
  public BlogEngineRepository(DbContext dataContext)
  {
    DbSet = dataContext.Set<T>();
    Context = dataContext;
  }
  public T Update(T entity)
  {
     DbSet.Attach(entity);
     var entry = Context.Entry(entity);
     entry.State = System.Data.EntityState.Modified;
  }
}

您可以查看答案的完整解释,以获取有效更新实体列表的方法,以获取有关仅更新详细信息的更多信息。

相关内容

  • 没有找到相关文章

最新更新