সত্তা ফ্রেমওয়ার্কে ডাটাবেস টাইমআউট সেট করুন


164

আমার কমান্ড সময়সীমা বেঁধে রাখে, তাই আমার ডিফল্ট কমান্ডের সময়সীমা মান পরিবর্তন করতে হবে।

আমি পেয়েছি myDb.Database.Connection.ConnectionTimeout, কিন্তু এটি readonly।

সত্তা ফ্রেমওয়ার্ক 5 এ আমি কমান্ডের সময়সীমা কীভাবে সেট করতে পারি ?


20
এফআইআই, ইএফ 6-এ, Database.CommandTimeoutআর কেবল পঠনযোগ্য নয়
— 21

2
@itsho তিনি কথা বলছিলেন Database.Connection.ConnectionTimeout। যাই হোক, আমি যা বলতে চাই Database.CommandTimeoutক্ষেত্রে ডান জিনিস আপনার প্রশ্নের সময়-ভ্রমণ (ব্যতিক্রম হয় System.Data.Entity.Core.EntityCommandExecutionExceptionধারণকারী System.Data.SqlClient.SqlException: Timeout expired.)।
— ডেভিড ফেরেঞ্জি রোগোয়ান


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এই নির্মাণকারীর মধ্যে অ্যাক্সেস করার চেষ্টা করেন কখনও কখনও পাওয়ারশেল / নুগেট কনসোল কমান্ডগুলি বৃত্তাকার পথে ব্যর্থ হয়ে যায় ।
— কেভিন গর্স্কি

130
সংযোগের সময়সীমা এবং কমান্ডটাইমআউট এবং দুটি পৃথক জিনিস। সংযোগের স্ট্রিং সেটিং, সংযোগের সময়সীমা কমান্ডটি চালানোর পরিমাণ (কমান্ডটাইমআউট) প্রভাবিত করবে না।
— ক্লে লেনার্ট

3
আমার সমস্যা ছিল একটি লিট আলাদা। আমি মাইগ্রেশন চলাকালীন সময়সীমা পেয়েছি। : মতিন মাইগ্রেশন সময় ব্যবহার করার জন্য সেট একটি অনুরূপ সম্পত্তি হয়েছে msdn.microsoft.com/en-us/library/...
— কার্স্টেন

2
আপনি কোন EF এর সংস্করণ ব্যবহার করেন তার উপর নির্ভর করে কমান্ডটাইমআউট সম্পত্তিটি কীভাবে নির্দিষ্ট করতে হবে তার বিভিন্ন API সম্পর্কে অনুভূতি পেতে এই উত্তরটি দেখুন ।
— জিম আহো

1
আমার পক্ষে কাজ করে না (কানেকশন বনাম কমান্ড আমার সন্দেহ হচ্ছে না)। এই পোস্টটি যদিও মীমাংসিত stackoverflow.com/questions/6232633/entity-framework-timeouts
— Jezbers

181

তুমি ব্যবহার করতে পার DbContext.Database.CommandTimeout = 180;

এটি বেশ সহজ এবং কোনও কাস্টের প্রয়োজন নেই।


1
আমাদের জন্য খুব কার্যকর যে Fluent APIEF ফর্ম ব্যবহার করে ।
— গোল্ডবিশপ

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

ডেটাবেস প্রথম অ্যাপ্রোচ জন্য:

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;
}

আপনি যদি আপনার ডাটাবেস মডেল পরিবর্তন করেন তবে এই টেমপ্লেটটি থেকে যায় তবে সত্যিকারের শ্রেণি আপডেট করা হবে।


কিছু কনফিগার ফাইল ব্যবহার করে আমরা টেমপ্লেটে টাইমআউট নির্দিষ্ট করতে পারি?
— shas

1
নিশ্চিত নয়, যদি সেখানে কিছু তৈরি হয় (আমি কিছু খুঁজে পেতে সক্ষম হই না)। 180 টি হার্ডকডিংয়ের পরিবর্তে আপনি System.Configuration.ConfigurationManager.AppSettings["keyname"]@ শাস ব্যবহার করতে পারেন
— খ্রিস্টান গোলহার্ট

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 ব্যবহার করছি)

সংযোগটাইমআউট সেটিং


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.