【发布时间】:2017-08-15 11:01:47
【问题描述】:
我的 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;
}
它还包含一个post Action:-
[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 时,对象被保存。有什么问题!?
【问题讨论】:
-
请提供repository
Add方法和unitOfWorkCommit方法 -
我添加了 iven unitOfWork 和 Repository 类方法
-
“我的猜测是在某个地方创建了不同的上下文对象。”我也是这么想。您可以通过在存储库和工作单元的构造函数中设置断点来轻松验证这一点。然后您可以调用
.GetHashCode(),如果结果不同,那么对象本身就是不同的(据我所知,DbContext不会覆盖GetHashCode)。 -
请告诉我们
IUnitOfWork和IRepository是如何注册到你的IoC容器的。 -
感谢@Balázs,您的建议很有用。
标签: c# entity-framework asp.net-mvc-4 dependency-injection repository-pattern