context.SaveChanges()不更新数据库中的数据

时间:2017-08-15 11:01:48

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

我的ApplictionDbContextClass看起来像这样: -

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    //private static ApplicationDbContext _context;
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    public DbSet<Trip> Trips { get; set; }
    public DbSet<Place> Places { get; set; }
    public DbSet<UserTripDetail> UserTripDetails { get; set; }
    public DbSet<TripPicture> TripPictures { get; set; }
}

我的TripPictureController看起来像这样: -

    //private readonly ApplicationDbContext _db = new ApplicationDbContext();
    private readonly IUnitOfWork _unitOfWork;
    private readonly ITripPictureRepository _tripPictureRepository;

    public TripPicturesController(IUnitOfWork unitOfWork, ITripPictureRepository tripPictureRepository)
    {
        _unitOfWork = unitOfWork;
        _tripPictureRepository = tripPictureRepository;
    }

它还包含一个帖子动作: -

    [HttpPost]
    public ActionResult Create(TripPicture model, HttpPostedFileBase ImageData)
    {
        if (ImageData != null)
        {
            model.TripId = 1;
            model.Image = this.ConvertToBytes(ImageData);
        }
        _tripPictureRepository.Add(model);
        _unitOfWork.Commit();
        //_db.TripPictures.Add(model);
        //_db.SaveChanges();
        return View(model);
    }

当我点击帖子请求时,模型不会被推入数据库。我在这里使用依赖注入。我的猜测是在某处创建了不同的上下文对象。我在启动类中看到以下代码: -

    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(**ApplicationDbContext.Create**);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);}

我的unitOfWork课程是: -

public class UnitOfWork : IUnitOfWork
{
    private DbContext _context;
    public UnitOfWork(DbContext dbContext)
    {
        _context = dbContext;
    }
    public void Commit()
    {
        _context.SaveChanges();
    }
}

我的存储库类是: -

public class Repository<T> : IRepository<T> where T : class
{
    protected DbSet<T> _dbSet;

    public Repository(DbContext context)
    {
        _dbSet = context.Set<T>();
    }

    public void Add(T entity)
    {
        _dbSet.Add(entity);
    }
}

当我不使用unitOfWork时,保存对象。有什么问题!?

2 个答案:

答案 0 :(得分:0)

您正在错误地实施工作单元模式。

您正在向_tripPictureRepository实例DbContext添加一个项目,并在_unitOfWork实例上调用_unitOfWork.Commit(),该实例有另一个DbContext实例,该实例不知道添加的项目(项目不是由_unitOfWork跟踪的#39; s DbContext)这意味着它什么都不保存。

工作单元的正确实现是您的存储库应作为属性公开,注入工作单元类的DbContext和存储库的DbSet<T>将填充{{1像这样:

DbContext

然后在你的控制器中注入一个IUnitOfWork实例:

public class UnitOfWork : IUnitOfWork
{
    private DbContext _context;

    public ITripPictureRepository TripsRepository{ get; }

    public UnitOfWork(DbContext dbContext)
    {
        _context = dbContext;
        Trips = new Repository<Trip>(_context.Trips)
    }

    public void Commit()
    {
        _context.SaveChanges();
    }
}

现在使用_unitOfWork实例进行CRUD操作:

private readonly IUnitOfWork _unitOfWork;

public TripPicturesController(IUnitOfWork unitOfWork)
{
    _unitOfWork = unitOfWork;
    _tripPictureRepository = tripPictureRepository;
}

您可以通过此Microsoft Docs page 一起阅读有关存储库和工作单元模式的更多信息。

答案 1 :(得分:0)

我发现了这个问题。每当由ninject生成时,我的DbContextObjects都不同。在我的ninject文件中,我在内核中注册服务如下: -

kernel.Bind<DbContext>().To<ApplicationDbContext>();

默认使用Transient范围,即每次需要时都会创建新对象。 因此我需要将其改为以下: -

kernel.Bind<DbContext>().To<ApplicationDbContext>().InRequestScope();

请求的范围意味着 - 只创建一个类型的实例,并为每个后续请求返回相同的实例。

更多信息可以在这里找到: - https://github.com/ninject/ninject/wiki/Object-Scopes