0

我正在为我的项目使用这个模板

   public interface IUnitOfWork
    {
        IDbSet<TEntity> Set<TEntity>() where TEntity : class;
        int SaveChanges();
        void RejectChanges();
        DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
    }

执行:

  public   class BookStoreDbContext : DbContext, IUnitOfWork

  {

    public DbSet<Categori> Categoris { get; set; }


    public new DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class
    {
        return base.Entry(entity);

    }

    public override int SaveChanges()
    {

        return base.SaveChanges();
    }

控制器:

 public class CategoriController : Controller
   {

    private IUnitOfWork _uw;

    private ICategoriService _categoriService;


    public CategoriController(IUnitOfWork uw,ICategoriService categoriservice )
    {
        _uw = uw;
        _categoriService = categoriservice;
    }




   public ActionResult Edit(int id = 0)
    {
        var categori = _categoriService.Find(i => i.Id == id);
        if (categori == null)
        {
            return HttpNotFound();
        }
        return View(categori);
    }

    [HttpPost]
    public ActionResult Edit(Categori categori)
    {
        if (ModelState.IsValid)
        {

              _uw.Entry(categori).State = EntityState.Modified;
                _uw.SaveChanges();
        }
        return View(categori);
    }
}

存储库或服务层:

 public interface IGenericService<T> : IDisposable where T : class
    {
    void Add(T entity);

    void Delete(T entity);
    T Find(Func<T, bool> predicate);
    IList<T> GetAll();
    IList<T> GetAll(Func<T, bool> predicate);


    }




 public interface ICategoriService : IGenericService<DomainClasses.Models.Categori>
   {

   }

暗示存储库:

 public class EfGenericService<TEntity> : IGenericService<TEntity> where TEntity : class
{
    protected IUnitOfWork _uow;
    protected IDbSet<TEntity> _tEntities;



    public EfGenericService(IUnitOfWork uow)
    {
        _uow = uow;
        _tEntities = _uow.Set<TEntity>();
    }


    public virtual void Add(TEntity entity)
    {
        _tEntities.Add(entity);
    }

    public void Delete(TEntity entity)
    {
        _tEntities.Remove(entity);
    }

    public TEntity Find(Func<TEntity, bool> predicate)
    {
        return _tEntities.Where(predicate).FirstOrDefault();
    }

    public IList<TEntity> GetAll()
    {
        return _tEntities.ToList();
    }

    public IList<TEntity> GetAll(Func<TEntity, bool> predicate)
    {
        return _tEntities.Where(predicate).ToList();
    }



 public class EfCategoriService : EfGenericService<Categori>,ICategoriService
{
      public EfCategoriService(IUnitOfWork uow)
        : base(uow)
      {
    }


}

全球.asax

 private static void InitStructureMap()
    {
        ObjectFactory.Initialize(
            x =>
                {
                    x.For<IUnitOfWork>().HttpContextScoped().Use(() => new BookStoreDbContext());
                     x.ForRequestedType<ServiceLayer.Interfaces.ICategoriService>()
                     .TheDefaultIsConcreteType<EfCategoriService>();

}

但是更新实体时出现此错误:

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目

请帮我解决这个错误?

4

1 回答 1

1

您的片段中唯一相关的行是:

_uw.Entry(categori).State = EntityState.Modified;
_uw.SaveChanges();

现在,看看你得到的异常:

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。

  • 是否设置实体状态以Modified 插入实体?不。
  • 它会删除实体吗?不。
  • 它会更新实体吗?是的。

  • EF 尝试更新的实体是否已被删除?好吧,也许。如何检查?删除实体时,数据库必须知道键才能知道要删除哪一行。要确认键是否正确,请在控制器发布操作中使用调试器,检查传递给方法的键值。categori它有预期值吗?如果没有,您的视图或将表单和路由值绑定到categori模型可能存在问题。如果是,请检查数据库中具有该键的实体是否在数据库表中。如果是,下一点。

  • 实体是否已被修改Categori如果您已将模型中的另一个属性标记为并发标记,则 EF 可能会“认为”它已在数据库中修改(即使它没有) 。如果该属性在数据库中或在GET 请求中加载实体和重新附加(将状态设置为Modified)之间的视图中发生更改,并且SaveChanges在 POST 请求中,您将遇到并发冲突。

优先级在上面用粗体进行了测试,因为在我看来它是问题的最可能原因。如果事实证明密钥没有预期值,最好提出一个新问题,因为这将是一个纯 ASP.NET MVC 问题,与 EF 以及您的 UOW 和服务架构无关。

于 2013-03-28T20:46:40.670 回答