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


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.