对MVC中的实体所做的更改未提交到数据库

时间:2014-07-11 11:29:40

标签: c# asp.net-mvc entity-framework repository-pattern

我正在使用Repository Pattern和Entity Framework与我的数据库和Core内容进行通信。

当我尝试对用户实体进行更改(更改电子邮件地址,用户名等)时,它不会在数据库中提交此更改。我意识到我已经错过了我的repositoy库中的更新方法中的一些东西,我遇到的麻烦就是找到我错过的东西。我缺少什么想法?对存储库模式非常新。

我一直在关注教程 - https://workspaces.codeproject.com/user-10620241/architecture-guide-asp-net-mvc-framework-n-tier-en

MVC控制器

public ActionResult Details(int id = 0)
    {
        UserModel user = _userService.GetSingle(u => u.Id == id);

        if (user == null)
        {
            return HttpNotFound();
        }
        return View(user);
    }

    [HttpPost]
    public ActionResult Details(UserModel model)
    {
        if (ModelState.IsValid)
        {
            _userService.Update(model);

            return RedirectToAction("Index");
        }

        return View(model);
    }

RepositoryBase.cs

public abstract class RepositoryBase<T> : IRepository<T>
    where T: class
{
    public RepositoryBase()
        : this(new ObRepositoryContext())
    {
    }

    public RepositoryBase(IRepositoryContext repositoryContext)
    {
        repositoryContext = repositoryContext ?? new ObRepositoryContext();
        _objectSet = repositoryContext.GetObjectSet<T>();
    }

    private IObjectSet<T> _objectSet;
    public IObjectSet<T> ObjectSet
    {
        get
        {
            return _objectSet;
        }
    }

    #region IRepository Members

    public void Add(T entity)
    {
        if (entity == null)
            throw new ArgumentNullException("entity");

        this.ObjectSet.AddObject(entity);
    }

    public void Update(T entity)
    {
        if (entity == null)
            throw new ArgumentNullException("entity");

        this._objectSet.Attach(entity);

        //TODO: Commit update to database here
    }

    public void Delete(T entity)
    {
        if (entity == null)
            throw new ArgumentNullException("entity");

        this.ObjectSet.DeleteObject(entity);
    }

    public IList<T> GetAll()
    {
        return this.ObjectSet.ToList<T>();
    }

    public IList<T> GetAll(Expression<Func<T, bool>> whereCondition)
    {
        return this.ObjectSet.Where(whereCondition).ToList<T>();
    }

    public T GetSingle(Expression<Func<T, bool>> whereCondition)
    {
        return this.ObjectSet.Where(whereCondition).FirstOrDefault<T>();
    }

    public void Attach(T entity)
    {
        this.ObjectSet.Attach(entity);
    }

    public IQueryable<T> GetQueryable()
    {
        return this.ObjectSet.AsQueryable<T>();
    }

    public long Count()
    {
        return this.ObjectSet.LongCount<T>();
    }

    public long Count(Expression<Func<T, bool>> whereCondition)
    {
        return this.ObjectSet.Where(whereCondition).LongCount<T>();
    }

    #endregion

}

1 个答案:

答案 0 :(得分:1)

好吧,你好像给自己留了一个TODO:)

 //TODO: Commit update to database here

您需要将对象标记为已修改 - 此处可以参考:

 this.ObjectSet.Context.ObjectStateManager.ChangeObjectState(
     entity, EntityState.Modified);

您还希望在您的上下文中的某个时刻调用SaveChanges - 您似乎在某种程度上鼓励多次更改和最终提交:

repositoryContext.SaveChanges();

修改

编译错误是因为您使用的repo已将ObjectSet抽象为其接口IObjectSet。你需要再次低估它:

  _objectSet // Or I guess (this.ObjectSet as ObjectSet<T>)
    .Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);

请注意,您关注的模式是在2010年使用EF 4.0完成的。从那时起,Entity Framework发生了很多变化,最值得注意的是DBContext,它与存储库模式IMO缩小了很大的差距。