2015-11-05 42 views
0

我遇到一个问题,我的更改未保存到数据库。没有错误被抛出。 这是奇怪的部分。只有当解决方案处于发布配置时才会发生。在发布配置中没有保存到数据库的更改

我不知道为什么会发生这种情况。我的第一个想法是,UnitOfWork没有注入与存储库相同的DbContext。但我确实将DbContextInRequestScope绑定,所以不应该如此。

我已经抽象实体框架的DbContext方式如下:

public class UnitOfWork : IUnitOfWork, IDisposable 
{ 
    private readonly MyContext _context; 

    public UnitOfWork(MyContext context) 
    { 
     _context = context; 
    } 

    public int Save() 
    { 
     return _context.SaveChanges(); 
    } 

    // omitted... 
} 

public class GenericRepository<T> : IGenericRepository<T> 
    where T : class 
{ 
    private readonly MyContext _context; 

    public GenericRepository(MyContext context) 
    { 
     _context = context; 
    } 

    public void Update(T entity) 
    { 
     _dbSet.Attach(entity); 
     _context.Entry(entity).State = EntityState.Modified; 
    } 

    // omitted... 
} 

我绑定的设置是这样的:

kernel.Bind<MyContext>().ToSelf().InRequestScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 
kernel.Bind(typeof(IGenericRepository<>)).To(typeof(GenericRepository<>)); 

注意的DbContext绑定了.InRequestScope()

我的控制器是这样的:

public class FooController : Controller 
{ 
    private readonly IUnitOfWork _unitOfWork; 
    private readonly IGenericRepository<foo> _fooRepository; 

    public FooController(IUnitOfWork unitOfWork, IGenericRepository<foo> fooRepository) 
    { 
     _unitOfWork = unitOfWork; 
     _fooRepository = fooRepository; 
    } 

    public ActionResult Update(Foo foo) 
    { 
     _fooRepository.Update(foo); 
     _unitOfWork.Save(); 
    } 

    // omitted... 
} 

你能找出错误?

+0

我不确定问题是否位于源代码中。您是否在配置管理器(菜单Build/Configuration Manager)中检查了项目设置,以了解Debug和Release版本之间的区别? – Martin

+0

在Release配置中,它们都设置为Release和Any CPU。然而,我试图设置所有我的绑定到InRequestScope,并工作,至少在我的初步测试。 –

+0

您是否将连接字符串设置为webconfig文件?因为您可以在调试和发布版本中使用不同的webconfig文件 – Daniel

回答

0

设置所有绑定到InRequestScope似乎已修复它。 我的假设是Ninject意识到注入的依赖关系绑定到InRequestScope,因此根据需要重新创建了依赖项。

看来并非如此。

kernel.Bind<MyContext>().ToSelf().InRequestScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
kernel.Bind(typeof(IGenericRepository<>)).To(typeof(GenericRepository<>)).InRequestScope();