1

マイApplictionDbContextClassは次のようになります -context.SaveChanges()データベース内のデータを更新しない

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

リポジトリ 'Add'方法およびUnitOfWorkの' Commit'方法 – demo

+0

を提供してください、私は私の推測では、どこか違うの作成があるさ」 –

+0

ivenたUnitOfWorkとリポジトリクラスメソッドを追加しましたコンテキストオブジェクト "私もそう思う。リポジトリーと作業ユニットの両方のコンストラクター内にブレークポイントを設定することで、簡単に確認できます。 '.GetHashCode()'を呼び出すことができます。結果が異なる場合、オブジェクト自体は異なります(私が知る限り、 'DbContext'は' GetHashCode'をオーバーライドしません)。 –

答えて

0

作業単位パターンが正しく実装されていません。

あなたは_tripPictureRepositoryインスタンスDbContextに項目を追加し、それを意味追加アイテム(アイテムが_unitOfWorkのDbContextによって追跡されていない)については考えていない別のDbContextインスタンスを持つ_unitOfWorkインスタンス上_unitOfWork.Commit()を呼び出しています何も保存しません。

作業単位の正しい実装は、あなたのリポジトリはプロパティとして公開されなければならないということです、あなたの仕事のクラスのユニットとリポジトリのDbSet<T>に注入DbContextは次のようにDbContextから移入されます。

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(); 
    } 
} 
あなたのCRUD操作を行うには

private readonly IUnitOfWork _unitOfWork; 

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

そして今_unitOfWorkインスタンスを使用します:

は、その後、あなたのコントローラでIUnitOfWorkインスタンスを注入

[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); 
} 

あなたはこのMicrosoft Docs pageから一緒に作業パターの宝庫とユニットについての詳細を読むことができます。

+0

ここでは、ninject依存性注入を使用しています。同じDbContextオブジェクトをコンストラクタに必要な場所に挿入してはいけませんか? –

+0

あなたが指摘した方法は、依存関係注入を使わずにリポジトリパターンを実装する方法の1つです。私のunitOfWorkの実装は、依存性注入を使用して間違っていないし、必要なときに同じオブジェクトを注入する能力があるので、私のリポジトリとunitOfWorkは実際には同じDbContextオブジェクトで動作している。 –

0

問題が見つかりました。私のDbContextObjectsは、ninjectによって生成されるたびに異なっていました。私は、次のようにカーネルにサービスを登録して、私のninjectファイルで: - 過渡スコープを使用しています

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

これはデフォルトで、すなわち新しいオブジェクトが必要とするたびに作成されます。 は、したがって、私は以下にそれを変更する必要が: -

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

要求された範囲は、手段 - タイプのみの単一のインスタンスが作成され、同じインスタンスが、各後続の要求のために返されます。

詳細はここで見つけることができます: - https://github.com/ninject/ninject/wiki/Object-Scopes

関連する問題