我的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时,保存对象。有什么问题!?
答案 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