c# - context.SaveChanges() not updating data in database -
my applictiondbcontextclass looks :-
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; } } my trippicturecontroller looks this:-
//private readonly applicationdbcontext _db = new applicationdbcontext(); private readonly iunitofwork _unitofwork; private readonly itrippicturerepository _trippicturerepository; public trippicturescontroller(iunitofwork unitofwork, itrippicturerepository trippicturerepository) { _unitofwork = unitofwork; _trippicturerepository = trippicturerepository; } it contains 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); } when ever hit post request, model not pushed database. using dependency injection here. guess somewhere there creation of different context object. saw following code in startup class :-
public void configureauth(iappbuilder app) { // configure db context, user manager , signin manager use single instance per request app.createperowincontext(**applicationdbcontext.create**); app.createperowincontext<applicationusermanager>(applicationusermanager.create); app.createperowincontext<applicationsigninmanager>(applicationsigninmanager.create);} my unitofwork class is:-
public class unitofwork : iunitofwork { private dbcontext _context; public unitofwork(dbcontext dbcontext) { _context = dbcontext; } public void commit() { _context.savechanges(); } } and repository class :-
public class repository<t> : irepository<t> t : class { protected dbset<t> _dbset; public repository(dbcontext context) { _dbset = context.set<t>(); } public void add(t entity) { _dbset.add(entity); } } the object saved when don't use unitofwork. problem!?
you implementing unit of work pattern incorrectly.
you adding item _trippicturerepository instance dbcontext , calling _unitofwork.commit() on _unitofwork instance has dbcontext instance has no idea added item (item isn't tracked _unitofwork's dbcontext) means saves nothing.
the correct implementation of unit of work repositories should exposed properties, dbcontext injected unit of work class , dbset<t> of repository populated dbcontext this:
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(); } } then in controller inject iunitofwork instance:
private readonly iunitofwork _unitofwork; public trippicturescontroller(iunitofwork unitofwork) { _unitofwork = unitofwork; _trippicturerepository = trippicturerepository; } and use _unitofwork instance crud operations:
[httppost] public actionresult create(trippicture model, httppostedfilebase imagedata) { if (imagedata != null) { model.tripid = 1; model.image = this.converttobytes(imagedata); } _unitofwork.tripsrepository.add(model); _unitofwork.commit(); return view(model); } you can read more repository , unit of work patter microsoft docs page.
Comments
Post a Comment