質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

2回答

2433閲覧

ASP.NET MVCで、Entity Frameworkを使用したときの、トランザクションの実装方法

hosys

総合スコア8

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2018/12/24 04:32

前提・実現したいこと

・ビジネスロジック層でトランザクションを制御したい。
・データベースアクセス層に、ビジネスロジック層からDbContextやTransactionを引数で渡すようなことはしたくない。

作ってみた設計

1.ビジネスロジック層で使用するためのscopeを作った。

C#

1 public class CustomDbContextScope : IDisposable 2 { 3 [ThreadStatic] 4 private static OurDbContext _dbContext; 5 6 [ThreadStatic] 7 private static DbContextTransaction _transaction; 8 9 internal static OurDbContext DbContext { get { return _dbContext; } } 10 internal static DbContextTransaction Transaction { get { return _transaction; } } 11 12 private bool isComplete = false; 13 14 public CustomDbContextScope() 15 { 16 if (_dbContext != null || _transaction != null) 17 { 18 throw new Exception("CustomDbContextScopeのコンストラクタで既にコネクションかトランザクションがある"); 19 } 20 _dbContext = new OurDbContext(); 21 _transaction = _dbContext.Database.BeginTransaction(); 22 } 23 24 public void Complete() 25 { 26 this.isComplete = true; 27 } 28 29 public void Dispose() 30 { 31 if (this.isComplete) 32 { 33 _transaction.Commit(); 34 _dbContext.Dispose(); 35 _transaction = null; 36 _dbContext = null; 37 } 38 else 39 { 40 _transaction.Rollback(); 41 _dbContext.Dispose(); 42 _transaction = null; 43 _dbContext = null; 44 } 45 } 46 }

2.データベースアクセス層で使用するためのscopeを作った。

C#

1 public class CustomContextUserScope : IDisposable 2 { 3 private OurDbContext _dbContext; 4 private bool isInTransaction = false; 5 6 public CustomContextUserScope () 7 { 8 if (CustomDbContextScope.DbContext == null) 9 { 10 this._dbContext = new OurDbContext(); 11 } 12 else 13 { 14 this._dbContext = CustomDbContextScope.DbContext; 15 this.isInTransaction = true; 16 } 17 } 18 19 public OurDbContext DbContext { get { return _dbContext; } } 20 21 public void Dispose() 22 { 23 if (!this.isInTransaction) 24 { 25 this._dbContext.Dispose(); 26 } 27 } 28 }

3.ビジネスロジック層での使用方法

C#

1using( CustomDbContextScope scope = new CustomDbContextScope() ) 2{ 3 // データベースアクセス層の呼び出しなど 4}

4.データベースアクセス層での使用方法

C#

1using( CustomDbContextUserScope scope = new CustomDbContextUserScope() ) 2{ 3 OurDbContext dbContext = scope.DbContext; 4 // dbContextを使った処理 5}

聞きたいこと

1.ThreadStatic属性やDbContext.Dispose()の仕組みがよくわかってないのですが、以上の設計は安全でしょうか。
2.あまりしっくりいってないのですが、以上の設計よりもよい設計がないでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/24 05:46

MVC , EF, Visual Studio のバージョンは何ですか? 質問文に追記してください。 MVC4 のタグが付いていますが、実際は MVC5 とかでしたらそのタグは外してください。
退会済みユーザー

退会済みユーザー

2018/12/24 08:49

上のことは無視ですか?
guest

回答2

0

質問の実装が理解できないのですが、そうする必要があるのは具体的にどういうケースですか?

SaveChanges() メソッドを実行してデータベースへの insert, delete, update 処理を行うと自動的にローカルトランザクションに束ねられてコミット(またはロールバック)されるのはご存知ですよね。

そして、ASP.NET MVC で CRUD を行う Controller / View を実装すると、すべてを SaveChanges() メソッド一行に任せておけば済むようなコードになるケースがほとんどだと思いますが・・・

投稿2018/12/24 05:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hosys

2018/12/24 07:09

・親テーブルの更新処理と子テーブルの更新処理を別のデータベースアクセス層のクラスに実装するが、SaveChanges()はビジネスロジック層に実装して、親子の更新処理を同時に行いたいとき ・selectからupdateの間に排他ロックをとりたくなったとき とかですかね
退会済みユーザー

退会済みユーザー

2018/12/24 08:50

ASP.NET MVC で? 何の話です?
guest

0

自己解決

↓を参考にすることにしました
https://blog.shibayan.jp/entry/20130504/1367672809

投稿2018/12/26 02:27

hosys

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問