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


324

फ़ंक्शन आयात का उपयोग करते समय मुझे एंटिटी फ्रेमवर्क (EF) का उपयोग करके टाइमआउट मिल रहा है जिसे पूरा होने में 30 सेकंड से अधिक का समय लगता है। मैंने निम्नलिखित की कोशिश की और इस मुद्दे को हल करने में सक्षम नहीं है:

मैंने उस प्रोजेक्ट में App.Config फ़ाइल में Default Command Timeout=300000कनेक्शन स्ट्रिंग में जोड़ा है जिसमें EDMX फ़ाइल है जैसा कि यहाँ सुझाया गया है

यह मेरा कनेक्शन स्ट्रिंग कैसा दिखता है:

<add 
    name="MyEntityConnectionString" 
    connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
       res://*/MyEntities.msl;
       provider=System.Data.SqlClient;provider connection string=&quot;
       Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
       Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
       MultipleActiveResultSets=True;Default Command Timeout=300000;&quot;"
    providerName="System.Data.EntityClient" />

मैंने अपनी रिपॉजिटरी में कमांडटाइमआउट को सीधे इस तरह सेट करने की कोशिश की:

private TrekEntities context = new TrekEntities();

public IEnumerable<TrekMatches> GetKirksFriends()
{
    this.context.CommandTimeout = 180;
    return this.context.GetKirksFriends();
}

ईएफ को टाइमिंग से बाहर करने के लिए मैं और क्या कर सकता हूं? यह केवल बहुत बड़े डेटासेट के लिए होता है। छोटे डेटासेट के साथ सब कुछ ठीक काम करता है।

यहाँ मुझे मिलने वाली त्रुटियों में से एक है:

System.Data.EntityCommandExecutionException: कमांड परिभाषा निष्पादित करते समय एक त्रुटि हुई। विवरण के लिए आंतरिक अपवाद देखें। ---> System.Data.SqlClient.SqlException: समय समाप्त हो गया। ऑपरेशन पूरा होने से पहले का समय समाप्त हो गया है या सर्वर जवाब नहीं दे रहा है।


ठीक है - मुझे यह काम मिला और यह मूर्खतापूर्ण है कि क्या हुआ। मेरे पास दोनों कनेक्शन स्ट्रिंग के साथ Default Command Timeout=300000और कमांडटाइमआउट 180 पर सेट था। जब मैंने Default Command Timeoutकनेक्शन स्ट्रिंग से हटा दिया , तो यह काम किया। तो इसका उत्तर मैन्युअल रूप से आपके संदर्भ ऑब्जेक्ट पर रिपॉजिटरी में कमांडटाइमआउट सेट करना है जैसे:

this.context.CommandTimeout = 180;

स्पष्ट रूप से कनेक्शन स्ट्रिंग में टाइमआउट सेटिंग सेट करने का उस पर कोई प्रभाव नहीं पड़ता है।


निकालें & quot; कनेक्शन स्ट्रिंग से
ब्रायन वेबस्टर


5
@ hamlin11 ईएफ कनेक्शन स्ट्रिंग में, यह परिभाषित करना आवश्यक है कि कनेक्शन स्ट्रिंग क्या है और ईएफ मेटाडेटा कौन सा हिस्सा है। &quot;स्ट्रिंग में छोड़ दें ।
Chev

2
इससे पहले कि आप EF टाइमिंग कर रहे हैं, यह देखने के लिए समय-समय पर जांच करने से पहले मेरा सुझाव है। हमारे मामले में हमने महसूस किया कि हमें NONCLUSTEREDकुछ तालिकाओं में अनुक्रमित जोड़ने की आवश्यकता है , इससे हमारे लिए समयबाह्य मुद्दा हल हो गया।
जुलुकोड़ा

मैं SQL टाइम आउट समस्या पर MS समर्थन के साथ काम कर रहा हूं - यह तब है जब DB को SQL Azure में होस्ट किया गया है। मुझे सभी Azure PaaS सेवाओं (Paa वेबसाइट्स और SQL Azure etc) के बारे में बताया गया था कि 230 सेकंड का एक सार्वभौमिक टाइमआउट है, और यह हमेशा पूर्वता लेता है, भले ही आप मैन्युअल रूप से टाइमआउट सेट करें। यह बहु-किरायेदार पासा बुनियादी ढांचे के संसाधनों की रक्षा करना है।
इयान रॉबर्टसन

जवाबों:


552

EF कनेक्शन स्ट्रिंग के भीतर डिफ़ॉल्ट कमांड टाइमआउट निर्दिष्ट करने के साथ एक ज्ञात बग है।

http://bugs.mysql.com/bug.php?id=56806

कनेक्शन स्ट्रिंग से मान निकालें और इसे डेटा संदर्भ ऑब्जेक्ट पर ही सेट करें। यह तब काम करेगा जब आप कनेक्शन स्ट्रिंग से परस्पर विरोधी मान निकाल देंगे।

इकाई फ्रेमवर्क कोर 1.0:

this.context.Database.SetCommandTimeout(180);

इकाई फ्रेमवर्क 6:

this.context.Database.CommandTimeout = 180;

इकाई फ्रेमवर्क 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

इकाई फ्रेमवर्क 4 और नीचे:

this.context.CommandTimeout = 180;

5
मैं edmx का उपयोग करके इसे कैसे प्राप्त कर सकता हूं?
इरुल

2
EntityFramework के किस संस्करण में यह तय किया गया है? मुझे इसके लिए EF बग नहीं मिल रहा है।
rudimenter

7
मुझे विश्वास नहीं है कि यह एक बग है, लेकिन डिजाइन के बजाय, रिमार्क्स अनुभाग यहां देखें लिंक
मिक पी

3
क्योंकि कुछ सेटिंग्स एमएस में हैं और कुछ एस में हैं, मैंने इसे यहां देखा , कमांडटाइमआउट सेकंड में है।
JabberwockyDecompiler

6
एंटिटी फ्रेमवर्क 7 में आप इसे DbContext / IdentityDbContext के कंस्ट्रक्टर में सेट कर सकते हैं:this.Database.SetCommandTimeout(180);
थॉमस

101

यदि आप DbContext का उपयोग कर रहे हैं, तो कमांड टाइमआउट सेट करने के लिए निम्नलिखित कंस्ट्रक्टर का उपयोग करें:

public class MyContext : DbContext
{
    public MyContext ()
    {
        var adapter = (IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = 1 * 60; // value in seconds
    }
}

3
@ErickPetru, ताकि आप इसे आसानी से मिनटों की एक अलग संख्या में बदल सकें :), मुझे भी आश्चर्य नहीं होगा अगर कंपाइलर उस गुणन का अनुकूलन करता है!
जोएल वर्गेन

2
@JoelVerhagen, हैरान मत होइए। जब ऑटो ऑप्टिमाइज़ेशन होता है, तो यहां एक अच्छी व्याख्या है: stackoverflow.com/questions/160848/… । इस मामले में, मुझे लगता है कि ऐसा भी होता है (क्योंकि वे दो शाब्दिक मूल्य हैं), लेकिन ईमानदारी से मुझे लगता है कि कोड इस तरह से अजीब है।
एलिक पेट्रुकेली

33
meh ... बच्चे भूख से मर रहे हैं ... कौन परवाह करता है 1 * 60 के बारे में?
टिमर्ज़ जूल

9
@ ErikPetru, यह वास्तव में एक बहुत ही सामान्य अभ्यास है और कोड को अधिक पठनीय बनाता है।
केल्विन

इसे संभालने का सबसे अच्छा तरीका क्या है कि मेरा DbContextव्युत्पन्न वर्ग एक edmxफ़ाइल से उत्पन्न हुआ ?
बजे मैट बर्लैंड जू

41

यदि आप उपयोग कर रहे हैं DbContextऔर EF v6 +, वैकल्पिक रूप से आप उपयोग कर सकते हैं:

this.context.Database.CommandTimeout = 180;

13

आमतौर पर मैं एक लेनदेन के भीतर अपने संचालन को संभालता हूं । जैसा कि मैंने अनुभव किया है, यह संदर्भ कमांड टाइमआउट सेट करने के लिए पर्याप्त नहीं है, लेकिन लेनदेन को टाइमआउट पैरामीटर के साथ एक निर्माता की आवश्यकता है। मुझे इसे ठीक से काम करने के लिए दोनों समय मूल्यों को निर्धारित करना था।

int? prevto = uow.Context.Database.CommandTimeout;
uow.Context.Database.CommandTimeout = 900;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) {
...
}

फ़ंक्शन के अंत में मैंने कमांड टाइमआउट को प्रोटो में पिछले मान पर सेट किया।

EF6 का उपयोग करना


एक अच्छा दृष्टिकोण बिल्कुल नहीं। मैं लेन-देन के दायरे को बहुत अधिक जोड़ता था और यह एक परियोजना में मेरे लिए एक बुरा सपना बन गया। अंततः EF 6+ में एकल SAVEChanges () के साथ सभी लेन-देन की गुंजाइश को बदल दिया गया। इस चेक coderwall.com/p/jnniww/...
चन्द्रमा

इस उत्तर में उच्च मत होना चाहिए। मैंने टाइमआउट बढ़ाने के लिए सभी अलग-अलग तरीकों की कोशिश की, लेकिन जब मैंने बीओटीएच संदर्भ कमांड टाइमआउट और ट्रांजेक्शन स्कोप को सेट किया, तब यह काम किया।
गैंग

3

मुझे पता है कि यह बहुत पुराना धागा है, लेकिन फिर भी ईएफ ने इसे ठीक नहीं किया है। ऑटो-जनरेट करने वाले लोगों के DbContextलिए टाइमआउट को मैन्युअल रूप से सेट करने के लिए निम्न कोड का उपयोग कर सकते हैं।

public partial class SampleContext : DbContext
{
    public SampleContext()
        : base("name=SampleContext")
    {
        this.SetCommandTimeOut(180);
    }

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

3

यदि आप मेरी तरह एंटिटी फ्रेमवर्क का उपयोग कर रहे हैं, तो आपको स्टार्टअप क्लास पर टाइम आउट को इस प्रकार परिभाषित करना चाहिए:

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));

1

यह वही है जिसकी मैंने फंडिंग की है। शायद यह किसी को मदद करेगा:

तो अब हम शुरू करें:

यदि आप इस तरह सूची में शामिल कुछ सटीक तत्वों की तलाश में EF के साथ LINQ का उपयोग करते हैं:

await context.MyObject1.Include("MyObject2").Where(t => IdList.Contains(t.MyObjectId)).ToListAsync();

जब तक IdList में एक से अधिक Id होते हैं, तब तक सब कुछ ठीक चल रहा होता है।

यदि सूची में सिर्फ एक आईडी है तो "टाइमआउट" समस्या सामने आती है। यदि IdList में आईडी की संख्या की जांच करने के लिए समस्या का उपयोग करने के लिए समस्या को हल करने के लिए।

उदाहरण:

if (IdList.Count == 1)
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.FirstOrDefault()==t. MyObjectId).ToListAsync();
}
else
{
    result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.Contains(t. MyObjectId)).ToListAsync();
}

स्पष्टीकरण:

बस Sql Profiler का उपयोग करने का प्रयास करें और Entity फ्रेमवर्क द्वारा निर्मित चयन कथन की जांच करें। ...

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