ITエンジニア向け 情報館  
   

 

ADO.NET(EntityFramework)

自動トランザクションが機能しない問題

ADO.NETで自動トランザクションを効かせたプログラムコード(TransactionScopeクラスを用いたコード)を書いても、自動トランザクションが働かない場合がありました。

調査したところ、接続文字列にenlist=falseが指定されていました。
これが指定されると、トランザクションに参加しない設定になるようです。
詳細は、検索エンジンで「enlist false」などと入力すれば、さまざまな情報サイトが出てきます。

基本トランザクションマネージャとの通信が失敗しました。

このエラーメッセージが出た時、MSDTCの設定で「セキュリティ>トランザクションマネージャー通信>相互認証を必要とする」にチェックが入っていると、トランザクションの最中にエラーが出てDBアクセスに失敗することがあります。この項目で「認証を必要としない」に設定すると、正常にトランザクションが実行されます。

詳細は以下のページも参照のこと。
http://www.logistech.co.jp/techtips/msdtc.html

トランザクション処理の途中でのエラー

トランザクションの状態に対して操作が有効ではありません。
基になるプロバイダーが Open で失敗しました

このエラーメッセージが表示されるとき、TransactionScope.Completeメソッドの記述忘れがないか確認してみましょう。エラー発生個所の前の段階の処理を確認しましょう。このエラーは、ロールバックしたトランザクションに対して、DB処理を続けて行おうとしたときに発生します。
Completeメソッドを書き忘れていると、トランザクション処理の一部でロールバックが行われてしまいます。Completeを書き忘れている個所がないか、処理ロジックを確認してみましょう。

EntityFrameworkでSQL関数にマッピングされるCLRのメソッド

EntityFrameworkでSQL関数にマッピングされるCLRのメソッドの一覧が、下記にまとめられています。
これで、EntityFrameworkを使ったクエリ式に書けるメソッドを把握することができます。
http://msdn.microsoft.com/ja-jp/library/bb738681.aspx

EntityFrameworkでSQL文を直接実行する方法

下記URL参照。
http://mslaboratory.blog.eonet.jp/default/entity_framework/

IDENTITY列にInsertした時の値の取得方法

Entity FrameworkまたはSqlCommandを使って、IDENTITY 列を持ったテーブルに行を挿入した時の IDENTITY 列の値を取得する方法です。
http://code.msdn.microsoft.com/DataAccess-howto-383a3202/
http://code.msdn.microsoft.com/DataAccess-howto-b5a084df/

EntityFramework(CodeFirst)でdatetime2型のエラーが発生する原因と対応

http://kazenetu.exblog.jp/18969119

EntityFrameworkで、app.configで定義した接続文字列の動的変更

下記のようなコードで、変更可能。ただし、実行環境下でconfigファイルが書き換えられてしまうので、以後は永続的に有効になってしまう点に注意。
接続文字列を元に戻したい場合は、生成されたconfigファイルを削除すればよい。

var openedConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
openedConfig.ConnectionStrings.ConnectionStrings[app.configで定義されている接続文字列名].ConnectionString = 変更後の接続文字列本体
openedConfig.Save();
ConfigurationManager.RefreshSection("connectionStrings");