एंटिटी फ्रेमवर्क में डेटाबेस टाइमआउट सेट करें


164

मेरा कमांड टाइम आउट करता है, इसलिए मुझे डिफ़ॉल्ट कमांड टाइमआउट वैल्यू को बदलना होगा।

मुझे मिल गया है myDb.Database.Connection.ConnectionTimeout , लेकिन यह है readonly

मैं एंटिटी फ्रेमवर्क 5 में कमांड टाइमआउट कैसे सेट कर सकता हूं ?


20
FYI करें, Database.CommandTimeout
EF6

2
@itsho वह बात कर रहा था Database.Connection.ConnectionTimeout। वैसे भी, मैं कहूंगा कि Database.CommandTimeoutआपकी क्वेरी टाइम-आउटिंग (अपवाद System.Data.Entity.Core.EntityCommandExecutionExceptionवाली System.Data.SqlClient.SqlException: Timeout expired.) होने की स्थिति में सही बात है ।
डेविड फेरेंस्की रोगोजान 14


1
मुझे लगता है कि आप वास्तव में कनेक्शन के समय के बारे में परवाह नहीं करते हैं, लेकिन इसके बजाय आप COMMAND टाइमआउट को समायोजित करना चाहते हैं।
वर्थ 7

जवाबों:


199

अपने संदर्भ पर यह कोशिश करें:

public class MyDatabase : DbContext
{
    public MyDatabase ()
        : base(ContextHelper.CreateConnection("Connection string"), true)
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
    }
}

यदि आप कनेक्शन स्ट्रिंग में टाइमआउट को परिभाषित करना चाहते हैं, Connection Timeoutतो निम्न कनेक्शन स्ट्रिंग में पैरामीटर का उपयोग करें :

<connectionStrings>

<add name="AdventureWorksEntities"
connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;
provider=System.Data.SqlClient;provider connection string='Data Source=localhost;
Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60;
multipleactiveresultsets=true'" providerName="System.Data.EntityClient" />

</connectionStrings>

स्रोत: कैसे: कनेक्शन स्ट्रिंग को परिभाषित करें


1
मैं कनेक्शन स्ट्रिंग संस्करण का उपयोग करने की सलाह दूंगा जैसे कि आप ObjectContextइस निर्माता में कभी-कभी एक्सेस करने का प्रयास करते हैं PowerShell / NuGet कंसोल कमांड एक परिपत्र तरीके से विफल हो जाएंगे
केविन गोर्स्की

130
कनेक्शन टाइमआउट और कमांडटाइमआउट और दो अलग-अलग चीजें। कनेक्शन स्ट्रिंग सेटिंग, कनेक्शन टाइमआउट, कमांड रन (कमांडटाइम) के समय की मात्रा को प्रभावित नहीं करेगा।
क्ले लेनहार्ट

3
मेरी समस्या एक अलग तरह की थी। प्रवास के दौरान मुझे समय मिला। EF के पास प्रवासन के दौरान उपयोग करने के लिए एक समान संपत्ति है: msdn.microsoft.com/en-us/library/…
Karsten

2
आपके द्वारा उपयोग किए जाने वाले ईएफ के किस संस्करण के आधार पर, कमांडटाइमआउट संपत्ति निर्दिष्ट करने के तरीके में विभिन्न एपीआई के बारे में महसूस करने के लिए यह उत्तर देखें ।
जिम अहो

1
मेरे लिए काम नहीं करता है (कनेक्शन बनाम कमांड मुझे एक ही चीज़ पर संदेह नहीं है)। इस पोस्ट ने इसे हल कर दिया, हालांकि stackoverflow.com/questions/6232633/entity-framework-timeouts
Jezbers

181

आप उपयोग कर सकते हैं DbContext.Database.CommandTimeout = 180;

यह बहुत आसान है और कोई कलाकारों की आवश्यकता है।


1
हमारे लिए बहुत उपयोगी है कि Fluent APIईएफ के रूप का उपयोग करें ।
गोल्डबिशप

20

मेरा आंशिक संदर्भ इस तरह दिखता है:

public partial class MyContext : DbContext
{
    public MyContext (string ConnectionString)
        : base(ConnectionString)
    {
        this.SetCommandTimeOut(300);
    }

    public void SetCommandTimeOut(int Timeout)
    {
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = Timeout;
    }
}

मैंने SetCommandTimeOutजनता को केवल इसलिए छोड़ दिया कि मुझे लंबे समय (5 मिनट से अधिक) की आवश्यकता है जिसे मैं वैश्विक समयबाह्य के बजाय संशोधित करता हूं।


9

उत्पन्न कंस्ट्रक्टर कोड में इसे कॉल करना चाहिए OnContextCreated()

मैंने समस्या को हल करने के लिए इस आंशिक वर्ग को जोड़ा:

partial class MyContext: ObjectContext
{
    partial void OnContextCreated()
    {
        this.CommandTimeout = 300;
    }
}

8

मैंने रोनी के जवाब को एक धाराप्रवाह कार्यान्वयन के साथ बढ़ाया ताकि आप इसे इस तरह उपयोग कर सकें:

dm.Context.SetCommandTimeout(120).Database.SqlQuery...

public static class EF
{
    public static DbContext SetCommandTimeout(this DbContext db, TimeSpan? timeout)
    {
        ((IObjectContextAdapter)db).ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;

        return db;
    }

    public static DbContext SetCommandTimeout(this DbContext db, int seconds)
    {
        return db.SetCommandTimeout(TimeSpan.FromSeconds(seconds));
    } 
}

8

पहले Aproach डेटाबेस के लिए:

हम इसे एक कंस्ट्रक्टर में सेट कर सकते हैं, ContextName.Context.tt T4 टेम्पलेट को ओवरराइड करके इस प्रकार है:

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
    public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
        Database.CommandTimeout = 180;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
        this.Configuration.LazyLoadingEnabled = false;
<#
}

Database.CommandTimeout = 180; तीक्ष्ण परिवर्तन है।

उत्पन्न आउटपुट यह है:

public ContextName() : base("name=ContextName")
{
    Database.CommandTimeout = 180;
}

यदि आप अपना डेटाबेस मॉडल बदलते हैं, तो यह टेम्प्लेट रहता है, लेकिन वास्तविक वर्ग अपडेट हो जाएगा।


क्या कोई तरीका है कि हम कुछ विन्यास फाइल का उपयोग करके टेम्पलेट में टाइमआउट निर्दिष्ट कर सकते हैं।
शस

1
यकीन नहीं, अगर वहाँ कुछ निर्माण (मैं कुछ खोजने में सक्षम नहीं था)। लेकिन हार्डकोडिंग 180 के बजाय, आप System.Configuration.ConfigurationManager.AppSettings["keyname"]@shas
क्रिश्चियन गोल्हार्ट

7

अन्य उत्तर के रूप में भी, लेकिन एक विस्तार विधि के रूप में:

static class Extensions
{
    public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
    {
        db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
    }
}

और मैं इस विस्तार विधि को कैसे कहूं?
वांडर्सन लोपेज़

1

मैं बस इस समस्या में भाग गया और इसे अपने एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल को अपडेट करके हल किया। प्रश्न में कनेक्शन के लिए, "कनेक्शन टाइमआउट = 60" निर्दिष्ट करें (मैं इकाई रूपरेखा संस्करण 5.0.0.0 का उपयोग कर रहा हूं)

कनेक्शन टाइमआउट सेटिंग


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.