web-dev-qa-db-ja.com

Entity Framework-現在のコマンドのタイムアウト値は何ですか

Entity Framework 5を使用していますが、コマンドのタイムアウト値を知りたいです。

そのためには、dbContextオブジェクトをObjectContextにキャストし、CommandTimeoutプロパティにアクセスします。

int ? currentCommandTimeout = ((IObjectContextAdapter)dbContext).ObjectContext.CommandTimeout;

このプロパティの現在の値はnullです。つまり、現在のコマンドタイムアウトは、基になるプロバイダーの既定値です。

  1. 基礎となるプロバイダーは誰ですか?
  2. この場合、現在のコマンドのタイムアウト値を(EFコードを介して)どうすれば読み取ることができますか?

MSDN ObjectContext CommandTimeoutプロパティリファレンス

編集:コマンドタイムアウトの設定方法を説明し、ドキュメントでデフォルトのコマンドタイムアウト値を見つけていただき、ありがとうございます。ただし、問題は未解決のままです。可能であれば、デフォルトでEFを使用してコマンドタイムアウト値を読み取る方法.

20
Oren

MSDNから、

  • CommandTimeoutプロパティは、すべてのオブジェクトコンテキスト操作のタイムアウト値を秒単位で取得または設定します。
  • null値は、基礎となるプロバイダーのデフォルト値が使用されることを示します。

したがって、コードを使用して明示的に設定したり、接続文字列(MySQLで)で渡したりしない場合は、プロバイダーのデフォルト値になります。

CommandTimeoutのnull以外の値を表示する場合は、connectionStringで渡すか、コードで設定する必要があります。

基礎となるプロバイダーは誰ですか?

基になるプロバイダーは、providerNameとして接続文字列で渡すプロバイダーです。

<connectionStrings>
  <clear />
  <add name="Name" 
   providerName="System.Data.ProviderName" 
   connectionString="Valid Connection String;" />
</connectionStrings>

ここで、System.Data.ProviderNameは基礎となるプロバイダーです。

MySql Documentation および [〜#〜] msdn [〜#〜] に従って、MySqlまたはMS Sqlを使用している場合、

  • デフォルト値は30 secsです。
  • 値0は、無期限の待機を示し、回避する必要があります。

    注:

MySQLデータベースプロバイダーの場合、デフォルトのコマンドタイムアウトは、接続文字列属性Default Command Timeoutを使用して変更できます。

19
Bhushan Firake

これは動作するはずです

var ctx = new DbContext();
ctx.Database.CommandTimeout = 120;
5
afr0

SQLServerを使用している場合、デフォルトのコマンドタイムアウトは30秒です。

SqlCommand.CommandTimeoutプロパティ

4
Jason Massey
  1. 基礎となるプロバイダーは誰ですか?

任意のデータベースにリモートで接続し、SQLクエリを起動するには、クエリの起動中に実行されるさまざまなアクションの通信セマンティクスを理解するメカニズムまたはメディエーター(言うことができます)が必要です。コマンドの作成、接続の確立、接続タイムアウトの処理、再試行など。

これらすべての責任は、接続しようとしているデータベースのプロバイダーによって処理されます。これらのプロバイダーには、さまざまな実装とクラスw.r.tがあります。接続元の環境(C#、Java、Python、Perlなど)。したがって、MySQLデータベースに接続するには、Java、.net、またはpython programming world。

  1. この場合、現在のコマンドのタイムアウト値を(EFコードを介して)読み取るにはどうすればよいですか?

いや。これは不可能です。 dbContext.Database.CommandTimeoutプロパティをよく見ると、タイプはint?です。したがって、このプロパティをnull可能なintとして保持するロジスティクスは、デフォルト値(nullとして)を表すことだけです。 Entity Framework(EF)は、C#コードで明示的な値を設定するまで何も公開しません。次のデータベースに対してこれを確認しました

  • MySQL
  • SQLサーバー

どちらの場合でも、DBコンテキストオブジェクトを作成した後、コマンドタイムアウトプロパティがnullに設定されていることがわかります。

ただし、C#コードでdbContext.Database.CommandTimeoutプロパティを使用して一度null以外の値に設定した場合は、コマンドオブジェクトのget-setプロパティであるため、もちろん再度読み取ることができます。コードで明示的に設定された新しい値が常に表示されます。

nullに設定し直すと、EFは基になるプロバイダーのデフォルトのタイムアウトを使用して再び開始します。

EFレイヤーの代わりにプロバイダークラスを使用する:エンティティフレームワークのORMレイヤーを使用せず、代わりにプロバイダーのコアクラスを使用する場合は、確かに初期化自体のデフォルトのタイムアウト値を見ることができます。接続文字列自体にデフォルトのコマンドタイムアウト値が既に設定されているMySQLデータベースのコードを実行すると、40が表示されます。

private static void TestingCommandTimeOutInMySql()
        {
            string connetionString = "Server=localhost;Database=sakila;Uid=root;Pwd=Passw0rd;default command timeout=40;";
            MySqlConnection con = new MySqlConnection(connetionString);
            try
            {
                cnn.Open();
                Console.WriteLine("Connection Open ! ");
                MySqlCommand cmd = new MySqlCommand("select * from actor", con);
                var timeoutValue = cmd.CommandTimeout; //shows 40
                con.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Can not open connection ! ");
            }
        }

接続文字列に何も設定しない場合、MySQLのデフォルト値30が表示されます。ここでCommandTimeoutintであり、int?ではありません。そのため、EFはdbContext.Database.CommandTimeoutを介してEFによって最終的に公開されるプロバイダークラスのこのプロパティを公開しながら、確かに何らかのインテリジェンスを適用します。 EFは、これらのプロバイダークラスの単なるラッパーであり、インテリジェンスが追加されています。

接続刺し傷に関する追加の詳細:

SQL Serverプロバイダーの場合:Microsoft SQLサーバーの接続文字列形式では、カスタムコマンド実行タイムアウトを設定できるプロパティは提供されません。そのため、SQL Serverプロバイダーの初期化中に値を設定することは不可能です。インスタンス化/初期化の後でも、C#コードの値はいつでも変更できます。詳細を見ることができます こちら

MySQLプロバイダーの場合:私のSQL接続文字列形式では、デフォルトのコマンドタイムアウトを明示的に設定することができます。詳細を見つけることができます こちら 。次のように、MySQL接続文字列でカスタムのデフォルトコマンドタイムアウト値を指定できます-

default command timeout=200;
3
RBT

これが私のやり方です。

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext
int commandTimeout = objectContext.CommandTimeout 
    ?? objectContext.Connection.CreateCommand().CommandTimeout;
1
enoshixi