私のasp.net mvcエンティティフレームワーク6プロジェクトで単体テストを行いたいので、自分のコードを見せなくてはなりません。私は自分のコントローラを自分の状況にさらして、おそらくそれを分けておくべきだと決めました。私は最初にリポジトリ/ UoWパターンを見ていましたが、多くを読んだ後、DIを使って単純なサービスパターンを決定しました(コントローラにはGetProducts()
、FindProduct()
などのサービスが注入されています)。サービスパターンエンティティフレームワークasp.net mvc
私の質問はこのパターンでの変更の追跡に関するものです。多くのことは、コントローラ方式で行われますが、これらのようにすべて作られたメソッドを分離した後、私はちょうどSaveChanges()
を呼び出します前に:あなたはSaveChanges()
が2回呼び出されていることがわかり上記で
public void AddRequest(Request request)
{
using (PricedNotesContext ctxt = new PricedNotesContext())
{
ctxt.Requests.Add(request);
ctxt.SaveChanges();
}
}
public void DeleteRequestData(BaseRequestData reqData)
{
using (PricedNotesContext ctxt = new PricedNotesContext())
{
ctxt.RequestData.Remove(reqData);
ctxt.SaveChanges();
}
}
を。しかし、私はそれが一度呼び出されるだけです。両方の操作が正常に完了した場合、私の変更だけが持続するようにしたい。お勧めの解決方法は、SaveChanges()
とDispose()
というメソッドを持っているだけで、明らかにトランザクションを管理するコントローラにはSaveChanges()
とDispose()
が公開されていますか?
ありがとうございました!
作業単位について読むことをお勧めします。データレイヤーコンポーネントではなく、アプリケーション/ビジネスレイヤー内の作業単位/コンテキストを一度だけインスタンス化します。そして、それをさらに注入してください。 –
ええ。 PriceNotesContextをすべてのメソッドでインスタンス化するのではなく、コントローラに注入する必要があります。 Web環境では、コンテキスト自体が作業単位のように動作するため、実際に作業単位は必要ありません。私はBeginRequestでTransactionScopeを作成し、EndRequestでコミットします。今あなたの操作のどれもアトミックではありません。 – Fran
これは本質的に私が今持っているものです。私は私のサービスメソッドでSaveChanges()を使用していますが、トランザクション制御を行っています。 (質問のメソッドはサービスであり、以前のコントローラではありません。 – coolboyjules