Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 英孚元';无法检测到变化_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 英孚元';无法检测到变化

Asp.net mvc 英孚元';无法检测到变化,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我正在使用一个通用存储库和一个工作单元,不知道为什么它不会检测到我对数据库所做的更改 public abstract class Repository<T> : IRepository<T> where T : class, IAuditEntity { protected IObjectSet<T> _objectSet; public Repository(ObjectContext context) {

我正在使用一个通用存储库和一个工作单元,不知道为什么它不会检测到我对数据库所做的更改

public abstract class Repository<T> : IRepository<T>
    where T : class, IAuditEntity
{
    protected IObjectSet<T> _objectSet;

    public Repository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<T>();
    }

    #region IRepository<T> Members

    public abstract T GetById(object id);

    public IEnumerable<T> GetAll()
    {
        return _objectSet.Where(e => !e.IsDeleted).OrderByDescending(o => o.ModifiedOn);
    }

    public IEnumerable<T> Query(Expression<Func<T, bool>> filter)
    {
        return _objectSet.Where(filter);
    }

    public void Add(T entity)
    {
        _objectSet.AddObject(entity);
    }

    public void Update(T entity)
    {
       //some code here; not working
       //What do I need to put here?
    }

    public void Remove(T entity)
    {
        _objectSet.DeleteObject(entity);
    }
}
在此之前,我尝试使用以下方法更新记录:

[HttpPost]
    public ActionResult Edit(Student stud)
    {
        if (ModelState.IsValid)
        {
            var i = _unitOfWork.Students.GetById(stud.StudentID);
            TryUpdateModel(i);
            _unitOfWork.Commit();
            return RedirectToAction("Index");
        }
        return View(stud);
    }

当然它是有效的,但我确信这不是正确的方法。只想问一下我需要什么才能使我的存储库上的更新方法正常工作?

您需要保持对存储库中上下文的引用,并使用以下方法:

public void Update(T entity)
{
   _objectSet.Attach(entity);
   _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}

之所以会发生这种情况,是因为当学生对象发回控制器时,由于HTTP的无状态性质,它不再附加到实体框架上下文

第二种方法是从数据库中获取记录并对其进行修改,这很好,但显然需要到数据库进行额外的往返

public abstract class Repository<T> : IRepository<T>
    where T : class, IAuditEntity
{
    protected IObjectSet<T> _objectSet;

    public Repository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<T>();
    }

    #region IRepository<T> Members

    public abstract T GetById(object id);

    public IEnumerable<T> GetAll()
    {
        return _objectSet.Where(e => !e.IsDeleted).OrderByDescending(o => o.ModifiedOn);
    }

    public IEnumerable<T> Query(Expression<Func<T, bool>> filter)
    {
        return _objectSet.Where(filter);
    }

    public void Add(T entity)
    {
        _objectSet.AddObject(entity);
    }

    public void Update(T entity)
    {
       //some code here; not working
       //What do I need to put here?
    }

    public void Remove(T entity)
    {
        _objectSet.DeleteObject(entity);
    }
}
我通常使用Dbcontext而不是ObjectContext,我相信它本质上是ObjectContext的包装器,具有一些额外的功能。我不确定这是否有帮助,但如果您使用DbContext,您将能够做到这一点

dbContext.Entry(stud).State = EntityState.Modified;
dbContext.SaveChanges();
可以通过ObjectContext调用AttachTo将返回的学生重新附加回上下文,然后在调用SaveChanges之前将其状态设置为modified,从而实现同样的效果