সত্তা ফ্রেমওয়ার্ক: ইতিমধ্যে এই কমান্ডের সাথে সম্পর্কিত একটি ওপেন ডেটা রিডার রয়েছে


285

আমি সত্তা ফ্রেমওয়ার্ক ব্যবহার করছি এবং মাঝে মাঝে আমি এই ত্রুটিটি পেয়ে যাব।

EntityCommandExecutionException
{"There is already an open DataReader associated with this Command which must be closed first."}
   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands...

যদিও আমি কোনও ম্যানুয়াল সংযোগ ব্যবস্থাপনা করছি না।

এই ত্রুটি মাঝে মাঝে ঘটে যায়।

কোড যা ত্রুটিটি ট্রিগার করে (পড়ার স্বাচ্ছন্দ্যের জন্য সংক্ষিপ্ত করে):

        if (critera.FromDate > x) {
            t= _tEntitites.T.Where(predicate).ToList();
        }
        else {
            t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
        }

প্রতিবার নতুন সংযোগ খোলার জন্য ডিসপোজ প্যাটার্ন ব্যবহার করে।

using (_tEntitites = new TEntities(GetEntityConnection())) {

    if (critera.FromDate > x) {
        t= _tEntitites.T.Where(predicate).ToList();
    }
    else {
        t= new List<T>(_tEntitites.TA.Where(historicPredicate).ToList());
    }

}

এখনও সমস্যাযুক্ত

ইএফ যদি সংযোগটি ইতিমধ্যে খোলা থাকে তবে এটি পুনরায় ব্যবহার করবে না।


1
আমি বুঝতে পারি যে এই প্রশ্নটি প্রাচীন, তবে আপনার predicateএবং historicPredicateভেরিয়েবলগুলি কী প্রকার তা জানতে আগ্রহী । আমি আবিষ্কার করেছি যে আপনি যদি এটি পাস Func<T, bool>করেন তবে Where()এটি সংকলন এবং কখনও কখনও কাজ করবে (কারণ এটি স্মৃতিতে "যেখানে" থাকে)। আপনি কি উচিত কাজ করা ক্ষণস্থায়ী হয় Expression<Func<T, bool>>থেকে Where()
জেমস

উত্তর:


351

এটি সংযোগ বন্ধ করার বিষয়ে নয়। EF সংযোগটি সঠিকভাবে পরিচালনা করে। এই সমস্যাটি সম্পর্কে আমার উপলব্ধি হ'ল একক সংযোগে একাধিক ডেটা পুনরুদ্ধার কমান্ডগুলি কার্যকর করা হয়েছে (বা একাধিক নির্বাচনের সাথে একক কমান্ড) যখন পরবর্তী ডেটা রিডার প্রথমটি পড়া শেষ করার আগে কার্যকর করা হয়। ব্যতিক্রম এড়ানোর একমাত্র উপায় হ'ল একাধিক নেস্টেড ডেটা রেইডার্সকে অনুমতি দেওয়া = একাধিকঅ্যাক্টিভর রিসাল্টসেটগুলি চালু করা। আপনি যখন ক্যোয়ারির (আইকুয়েরেবল) ফলাফলের মাধ্যমে পুনরাবৃত্তি করবেন এবং পুনরাবৃত্তির অভ্যন্তরে লোড সত্তার জন্য অলস লোডিং ট্রিগার করবেন তখন অন্য পরিস্থিতিটি সর্বদা ঘটে happens


2
এটা বোঝা যাবে। তবে প্রতিটি পদ্ধতির মধ্যে একটি মাত্র নির্বাচন রয়েছে।
সোনিক সোল 22

1
@ সোনিক: এটাই প্রশ্ন। সম্ভবত আরও একটি কমান্ড কার্যকর করা হয়েছে কিন্তু আপনি এটি দেখতে পাবেন না। আমি নিশ্চিত নই যে এটি প্রোফাইলার-এ সনাক্ত করা যায় কিনা (দ্বিতীয় পাঠক মৃত্যুদণ্ড কার্যকর হওয়ার আগে ব্যতিক্রম ছুঁড়ে ফেলা যায়)। এসকিউএল কমান্ড দেখতে আপনি অবজেক্টকোয়ারিতে ক্যোরিটি কাস্ট করারও চেষ্টা করতে পারেন এবং টট্রেসস্ট্রিংকে কল করতে পারেন। এটি ট্র্যাক করা কঠিন। আমি সবসময় মার্স চালু করি।
লাদিস্লাভ মৃঙ্কা

2
@ সোনিক: আমার উদ্দেশ্য কার্যকর করা এবং সম্পন্ন এসকিউএল কমান্ডগুলি চেক করা ছিল না।
লাডিস্লাভ Mrnka

11
দুর্দান্ত, আমার সমস্যাটি ছিল দ্বিতীয় পরিস্থিতি: 'আপনি যখন ক্যোয়ারির ফলাফলের মাধ্যমে পুনরাবৃত্তি করবেন (আইকিউচারযোগ্য) এবং পুনরাবৃত্তির ভিতরে লোড সত্তার জন্য অলস লোডিংটি ট্রিগার করবেন' '
আমর এলগারি

6
সক্ষম করা হলে তা MARS করতে : দৃশ্যত খারাপ পার্শ্ব প্রতিক্রিয়া আছে designlimbo.com/?p=235
সোরেন Boisen

126

বিকল্পভাবে MARS (মাল্টিপলএ্যাকটিভরিসাল্টসেটস) ব্যবহার করার জন্য আপনি নিজের কোডটি লিখতে পারেন যাতে আপনি একাধিক ফলাফলের সেটগুলি না খোলেন।

আপনি যা করতে পারেন তা হ'ল মেমোরিতে ডেটা পুনরুদ্ধার করা, এইভাবে আপনার পাঠক খোলা থাকবে না। এটি প্রায়শই অন্য ফলাফল সেটটি খোলার চেষ্টা করার সময় রেজাল্টের মাধ্যমে পুনরাবৃত্তি করার কারণে ঘটে।

কোডের উদাহরণ:

public class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

public class Blog
{
    public int BlogID { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int PostID { get; set; }
    public virtual Blog Blog { get; set; }
    public string Text { get; set; }
}

বলুন যে আপনি আপনার ডেটাবেজে এটির একটি অনুসন্ধান করছেন:

var context = new MyContext();

//here we have one resultset
var largeBlogs = context.Blogs.Where(b => b.Posts.Count > 5); 

foreach (var blog in largeBlogs) //we use the result set here
{
     //here we try to get another result set while we are still reading the above set.
    var postsWithImportantText = blog.Posts.Where(p=>p.Text.Contains("Important Text"));
}

আমরা .ToList () এর মতো করে এটির একটি সহজ সমাধান করতে পারি :

var largeBlogs = context.Blogs.Where(b => b.Posts.Count > 5).ToList();

এটি সত্ত্বাকে ফ্রেমওয়ার্কটিকে মেমোরিতে লোড করতে বাধ্য করে, এইভাবে যখন আমরা পুনরাবৃত্তি করি যদিও এটি ফোরচ লুপে এটি আর ডেটা রিডারটি তালিকাটি খোলার জন্য ব্যবহার না করে, পরিবর্তে এটি মেমোরিতে থাকে।

আমি বুঝতে পারি যে আপনি উদাহরণস্বরূপ কয়েকটি বৈশিষ্ট্য অলস লোড করতে চাইলে এটি পছন্দ করা যাবে না। এটি বেশিরভাগই একটি উদাহরণ যা আশা করে যে কীভাবে / কেন আপনি এই সমস্যা পেতে পারেন তা ব্যাখ্যা করে যাতে আপনি সেই অনুযায়ী সিদ্ধান্ত নিতে পারেন


7
এই সমাধানটি আমার পক্ষে কাজ করেছিল। অনুসন্ধানের পরে এবং ফলাফলের সাথে অন্য কিছু করার আগে .ToList () যুক্ত করুন।
TJKjaer

9
এটি সম্পর্কে সতর্কতা অবলম্বন করুন এবং সাধারণ জ্ঞান ব্যবহার করুন। আপনি যদি ToListএক হাজার অবজেক্ট তৈরি করছেন, এটি একটি টন স্মৃতি বাড়িয়ে তুলবে। এই নির্দিষ্ট উদাহরণে, আপনি প্রথমটির সাথে অভ্যন্তরীণ কোয়েরিটি একত্রিত করার চেয়ে ভাল হবেন তাই দুটিয়ের চেয়ে কেবল একটি কোয়েরি উত্পন্ন হয়।
কামরানিকাস

4
@ সুবকামরান আমার বক্তব্যটি ঠিক তা-ই ছিল, কোনও কিছু নিয়ে চিন্তা করা এবং পরিস্থিতির জন্য সঠিক কি তা বেছে নেওয়া, কেবল না করা। উদাহরণটি বর্ণনা করার জন্য আমি এলোমেলো কিছু মনে করেছি :)
জিম ওল্ফ

3
অবশ্যই, আমি কেবল এটি অনুলিপি / পেস্ট-খুশি লোকদের জন্য স্পষ্টভাবে উল্লেখ করতে চেয়েছিলাম :)
কামরানিকাস

আমাকে গুলি করবেন না, তবে এটি কোনওভাবেই প্রশ্নের সমাধান নয়। যেহেতু "স্মৃতিতে ডেটা টানছে" কখন থেকে এসকিউএল সম্পর্কিত সমস্যার সমাধান হয়? আমি ডাটাবেসের সাথে চ্যাটি হওয়া পছন্দ করি, তাই কোনওভাবেই আমি মেমরিতে কিছু টানতে পছন্দ করি না "কারণ অন্যথায় একটি এসকিউএল ব্যতিক্রম নিক্ষেপ করা হয়"। তবুও, আপনি প্রদত্ত কোডটিতে, ডাটাবেসের সাথে দুবার যোগাযোগ করার কোনও কারণ নেই। এক কল এ কাজ করা সহজ। এই জাতীয় পোস্ট সম্পর্কে সতর্কতা অবলম্বন করুন। টোললিস্ট, প্রথম, একক, ... কেবল তখনই ব্যবহার করা উচিত যখন ডেটা মেমরির প্রয়োজন হয় (সুতরাং কেবলমাত্র সেই ডেটা যা আপনি চান), যখন কোনও এসকিউএল ব্যতিক্রম ঘটে না তখনই।
ফ্রেডেরিক প্রজ্যাক

70

এই সমস্যাটি কাটিয়ে ওঠার আরও একটি উপায় আছে। এটি কোনও ভাল উপায় আপনার পরিস্থিতির উপর নির্ভর করে।

অলস লোডিংয়ের ফলে সমস্যার ফলস্বরূপ, তাই এটি এড়ানোর এক উপায় অন্তর্ভুক্তির ব্যবহারের মাধ্যমে অলস লোডিং না করা:

var results = myContext.Customers
    .Include(x => x.Orders)
    .Include(x => x.Addresses)
    .Include(x => x.PaymentMethods);

আপনি যদি যথাযথ ব্যবহার করেন Include গুলি মার্স সক্ষম করে এড়াতে পারবেন। তবে যদি আপনি একটিটি মিস করেন তবে আপনি ত্রুটিটি পেয়ে যাবেন, সুতরাং মার্স সক্ষম করা সম্ভবত এটির সমাধানের সহজতম উপায়।


1
কবজির মতো কাজ করেছেন। .Includeমারগুলি সক্ষম করার চেয়ে আরও ভাল সমাধান এবং আপনার নিজের এসকিউএল কোয়েরি কোড লেখার চেয়ে অনেক সহজ।
নোলোনার

15
যদি কারও যদি সমস্যা হয় যে আপনি কেবল ল্যাম্বডা না করেই "" স্ট্রিং "লিখুন" লিখতে পারেন তবে আপনাকে "System.Data.Entity ব্যবহার করে" যুক্ত করতে হবে কারণ এক্সটেনশন পদ্ধতিটি সেখানে রয়েছে।
জিম ওল্ফ

46

আপনি এই ত্রুটিটি পান, যখন আপনি সংগ্রহটি পুনরাবৃত্তি করার চেষ্টা করছেন সেটি একধরনের অলস লোডিং (আইকুয়েরিয়েবল)।

foreach (var user in _dbContext.Users)
{    
}

আইকিউরিবল সংগ্রহটিকে অন্য গণনাযোগ্য সংগ্রহে রূপান্তর করা এই সমস্যার সমাধান করবে। উদাহরণ

_dbContext.Users.ToList()

দ্রষ্টব্য: .ToList () প্রতিবার একটি নতুন সেট তৈরি করে এবং যদি আপনি বড় ডেটা নিয়ে কাজ করে থাকেন তবে এটি পারফরম্যান্স সমস্যার কারণ হতে পারে।


1
সহজতম সমাধান! বড় ইউপি;)
জ্যাকব সোবাস 20'13

1
আনবাউন্ডেড তালিকাগুলি আনতে তীব্র পারফরম্যান্স সমস্যা হতে পারে! কীভাবে কেউ এটিকে উজ্জীবিত করতে পারে?
সানড্রোক

1
@ স্যান্ডরক এমন কোনও ব্যক্তির পক্ষে নয় যা একটি ছোট সংস্থার হয়ে কাজ করে - SELECT COUNT(*) FROM Users= 5
সাইমন_উইভার

5
এ নিয়ে দু'বার ভাবুন। এই কিউ / এ পড়ছেন এমন একজন তরুণ বিকাশকারী যখন এটি একেবারে না হয় মনে করতে পারে এটি একটি সর্বকালের সমাধান। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি db থেকে আনবাউন্ডেড তালিকা আনার বিপদ সম্পর্কে পাঠকদের সতর্ক করতে আপনার উত্তরটি সম্পাদনা করুন।
স্যান্ডরক

1
@ সানড্রোক আমি মনে করি সেরা অনুশীলনের বর্ণনা দিয়ে কোনও উত্তর বা নিবন্ধ লিঙ্ক করার জন্য এটি আপনার পক্ষে ভাল জায়গা হবে।
সিনজাই

13

আমি কন্সট্রাক্টরের বিকল্পটি যুক্ত করে সহজেই (বাস্তববাদী) সমস্যার সমাধান করেছি। সুতরাং, আমি প্রয়োজন হলেই এটি ব্যবহার করি।

public class Something : DbContext
{
    public Something(bool MultipleActiveResultSets = false)
    {
        this.Database
            .Connection
            .ConnectionString = Shared.ConnectionString /* your connection string */
                              + (MultipleActiveResultSets ? ";MultipleActiveResultSets=true;" : "");
    }
...

2
ধন্যবাদ. ইহা কাজ করছে. আমি কেবলমাত্র ওয়েবকনফিগে সংযোগের স্ট্রিংয়ের মধ্যে একাধিকঅ্যাক্টিভ রিসার্টসেটস = সত্য সংযুক্ত করেছি
মোশারফ হোসেন

11

আপনার সংযোগ স্ট্রিং সেট করতে চেষ্টা করুন MultipleActiveResultSets=true। এটি ডাটাবেসে মাল্টিটাস্কিংয়ের অনুমতি দেয়।

Server=yourserver ;AttachDbFilename=database;User Id=sa;Password=blah ;MultipleActiveResultSets=true;App=EntityFramework

এটি আমার পক্ষে কাজ করে ... অ্যাপ্লিকেশন কনফিগে আপনার সংযোগ বা আপনি এটি প্রোগ্রামিকভাবে সেট করেছেন কিনা ... আশা করি এটি সহায়ক


মাল্টিপলএ্যাকটিভআরসাল্টসেটস = আপনার সংযোগের স্ট্রিংয়ে সত্য যুক্ত হওয়া সমস্যার সমাধান করবে। এটিকে নিচে ভোট দেওয়া উচিত হয়নি।
অ্যারন হুডন

হ্যাঁ নিশ্চিত হয়েছি যে আমি কীভাবে আপনার সংযোগের স্ট্রিংয়ে যুক্ত করতে পারি
মোহাম্মদ হোসাইন

4

আমি MyDataContext অবজেক্টের (যেখানে MyDataContext একটি EF5 কনটেক্সট অবজেক্ট) এর উদাহরণ উল্লেখ করতে আমার API ক্লাসে একটি স্থিতিশীল ক্ষেত্রটি ব্যবহার করার সিদ্ধান্ত নিয়েছিলাম, তবে সমস্যাটি মনে হয়েছে বলে মনে হয়। আমি আমার প্রতিটি এপিআই পদ্ধতিতে নিম্নলিখিতগুলির মতো কোড যুক্ত করেছি এবং এটি সমস্যার সমাধান করেছে।

using(MyDBContext db = new MyDBContext())
{
    //Do some linq queries
}

অন্য লোকেরা যেমন বলেছে, EF ডেটা প্রসঙ্গ বস্তুগুলি থ্রেড নিরাপদ নয়। সুতরাং এগুলি স্থিতিশীল বস্তুতে রাখলে অবশেষে সঠিক পরিস্থিতিতে "ডেটা রিডার" ত্রুটি ঘটবে।

আমার আসল ধারণাটি ছিল যে কেবলমাত্র অবজেক্টটির একটি উদাহরণ তৈরি করা আরও কার্যকর হবে এবং আরও ভাল মেমরি পরিচালনার সামর্থ্য রাখবে। এই বিষয়টি নিয়ে গবেষণা করে যা জড়ো করেছি, তা থেকে এটি হয় না। বাস্তবে, আপনার API এ প্রতিটি কলকে বিচ্ছিন্ন, থ্রেড নিরাপদ ইভেন্ট হিসাবে বিবেচনা করা আরও দক্ষ বলে মনে হচ্ছে। বিষয়টি নিশ্চিত করা যে সমস্ত সংস্থান যথাযথভাবে প্রকাশিত হয়েছে, কারণ বস্তুটি সুযোগের বাইরে চলে যায়।

বিশেষত যদি আপনি আপনার এপিআইটিকে পরবর্তী প্রাকৃতিক অগ্রগতিতে নিয়ে যান যা এটি কোনও ওয়েবসেসওয়ার বা REST এপিআই হিসাবে প্রকাশ করতে পারে sense

প্রকাশ

  • ওএস: উইন্ডোজ সার্ভার 2012
  • নেট: ইনস্টল করা 4.5, 4.0 ব্যবহার করে প্রকল্প
  • ডেটা উত্স: মাইএসকিউএল
  • অ্যাপ্লিকেশন ফ্রেমওয়ার্ক: এমভিসি 3
  • প্রমাণীকরণ: ফর্ম

3

আমি লক্ষ্য করেছি যে এই ত্রুটিটি ঘটে যখন আমি দেখার জন্য আইকিউরিবলটি প্রেরণ করি এবং এটি একটি ডাবল পূর্বাঞ্চে ব্যবহার করি, যেখানে অভ্যন্তরীণ অগ্রভাগেও সংযোগটি ব্যবহার করা দরকার। সাধারণ উদাহরণ (ভিউব্যাগ.প্যারেন্টস আইকুয়েরিয়েবল বা ডিবিসেট হতে পারে):

foreach (var parent in ViewBag.parents)
{
    foreach (var child in parent.childs)
    {

    }
}

.ToList()সংগ্রহটি ব্যবহার করার আগে সমাধানটি সহজ সমাধান । আরও মনে রাখবেন যে ম্যারস মাইএসকিউএল নিয়ে কাজ করে না।


ধন্যবাদ! এখানে থাকা সমস্ত কিছুই "নেস্টেড লুপগুলি সমস্যা হ'ল" তবে কীভাবে এটি ঠিক করবেন তা কেউ বলেনি। আমি ToList()ডিবি থেকে সংগ্রহ পেতে আমার প্রথম কলটি চালু করেছি। তখন আমি কforeach সেই তালিকায় এবং পরবর্তী কলগুলি ত্রুটিটি না দিয়ে পুরোপুরি কাজ করেছে।
আলবাট্রসকাফে

@ অ্যালবাট্রোস ক্যাফে ... তবে কেউ উল্লেখ করেনি যে সে ক্ষেত্রে আপনার ডেটা মেমোরিতে লোড হবে এবং ডিবি
লাইটনিং 3

3

আমি দেখতে পেয়েছি যে আমারও একই ত্রুটি ছিল এবং এটি তখন ঘটেছিল যখন আমি আপনার জন্য একটি এর Func<TEntity, bool>পরিবর্তে ব্যবহার করছিলাম ।Expression<Func<TEntity, bool>>predicate

একবার ভাবলাম সব আউট পরিবর্তিত Func'sকরতে Expression'sব্যতিক্রম নিক্ষিপ্ত হওয়ার বন্ধ করে দেয়।

আমি বিশ্বাস করি যে এটি EntityFramworkএমন কিছু চতুর কাজ করে Expression'sযা এর সাথে সহজভাবে হয় নাFunc's


এটির জন্য আরও বেশি পরিমাণের প্রয়োজন। আমি আমার ডেটা কনটেক্সট ক্লাসে এমন একটি পদ্ধতি গ্রহণ করার চেষ্টা করছিলাম (MyTParent model, Func<MyTChildren, bool> func)যাতে আমার ভিউমোডেলগুলি whereজেনেরিক ডেটা কনটেক্সট পদ্ধতিতে একটি নির্দিষ্ট অনুচ্ছেদ নির্দিষ্ট করতে পারে । আমি এটি না করা পর্যন্ত কিছুই কাজ করছিল না।
জাস্টিন

3

এই সমস্যাটি প্রশমিত করার 2 টি সমাধান:

  1. মেমরি ক্যাশে জোর করে অলস লোডিং রেখে .ToList()আপনার ক্যোয়ারির পরে লোডিংকে জোর করুন, যাতে আপনি এটির মাধ্যমে একটি নতুন ডেটারিডার খোলার মাধ্যমে পুনরাবৃত্তি করতে পারেন।
  2. .Include(/ অতিরিক্ত সত্তা আপনি ক্যোয়ারিতে লোড করতে চান /) এটিকে আগ্রহী লোডিং বলা হয়, যা আপনাকে (সত্যই) ডেটা রিডারের সাথে কোনও ক্যোয়ারির সম্পাদনের সময় যুক্ত বস্তু (সত্তা) অন্তর্ভুক্ত করতে দেয়।

2

এমআরএস সক্ষম করার এবং মেমরিতে সম্পূর্ণ ফলাফল পুনরুদ্ধারের মধ্যে একটি মাঝারি স্থলটি হল প্রাথমিক ক্যোয়ারিতে কেবল আইডিগুলি উদ্ধার করা এবং তারপরে প্রতিটি সত্তাকে বাস্তবায়ন করার সময় আইডিগুলি লুপ করা।

উদাহরণস্বরূপ ( এই উত্তর হিসাবে "ব্লগ এবং পোস্ট" নমুনা সত্তা ব্যবহার করে ):

using (var context = new BlogContext())
{
    // Get the IDs of all the items to loop through. This is
    // materialized so that the data reader is closed by the
    // time we're looping through the list.
    var blogIds = context.Blogs.Select(blog => blog.Id).ToList();

    // This query represents all our items in their full glory,
    // but, items are only materialized one at a time as we
    // loop through them.
    var blogs =
        blogIds.Select(id => context.Blogs.First(blog => blog.Id == id));

    foreach (var blog in blogs)
    {
        this.DoSomethingWith(blog.Posts);

        context.SaveChanges();
    }
}

এটি করার অর্থ এই যে আপনি কয়েক হাজার পূর্ণসংখ্যার গ্রাফের বিপরীতে কেবল কয়েক হাজার পূর্ণসংখ্যাকে স্মৃতিতে টানছেন, যা আপনাকে MARS সক্ষম না করে আইটেম-বাই-আইটেমটি কাজ করতে সক্ষম করার সময় মেমরির ব্যবহারকে হ্রাস করা উচিত।

এর আর একটি দুর্দান্ত সুবিধা, যেমন নমুনাটিতে দেখা গেছে, তা হ'ল আপনি প্রতিটি আইটেমের মধ্য দিয়ে লুপটি শেষ করার আগে অপেক্ষা করতে না পারার পরিবর্তে (বা অন্য কোনও এই জাতীয় কাজ) পরিবর্তনগুলি সংরক্ষণ করতে পারেন, এমনকি এটিরও প্রয়োজন হবে মার সক্ষম হয়েছে ( এখানে এবং এখানে দেখুন )।


context.SaveChanges();লুপের অভ্যন্তরে :( এটি ভাল নয় it এটি অবশ্যই লুপের বাইরে থাকতে হবে
জওয়ানদ সিং

1

আমার ক্ষেত্রে আমি দেখতে পেয়েছি যে myContext.SaveChangesAsync () কলগুলির আগে "অপেক্ষা" বিবৃতি অনুপস্থিত ছিল। এই অ্যাসিঙ্ক কলগুলি আমার জন্য ডেটা রিডার সমস্যাগুলি স্থির করার আগে অপেক্ষা করানো।


0

আমরা যদি আমাদের শর্তের কিছু অংশ ফানক <> বা এক্সটেনশন পদ্ধতিতে গোষ্ঠীবদ্ধ করার চেষ্টা করি তবে আমরা এই ত্রুটিটি পেয়ে যাব, মনে করুন আমাদের কাছে এর মতো কোড রয়েছে:

public static Func<PriceList, bool> IsCurrent()
{
  return p => (p.ValidFrom == null || p.ValidFrom <= DateTime.Now) &&
              (p.ValidTo == null || p.ValidTo >= DateTime.Now);
}

Or

public static IEnumerable<PriceList> IsCurrent(this IEnumerable<PriceList> prices) { .... }

এটি যদি কোথায় () ব্যবহার করে এটি ব্যবহার করার চেষ্টা করি তবে এর পরিবর্তে আমাদের কী করা উচিত তা হ'ল এইরকম একটি পূর্বাভাস তৈরি করা হবে:

public static Expression<Func<PriceList, bool>> IsCurrent()
{
    return p => (p.ValidFrom == null || p.ValidFrom <= DateTime.Now) &&
                (p.ValidTo == null || p.ValidTo >= DateTime.Now);
}

আরও আরও পড়তে পারেন: http://www.albahari.com/nutshell/predicatebuilder.aspx


0

এই সমস্যাটি কেবলমাত্র ডাটাগুলিকে একটি তালিকায় রূপান্তর করে সমাধান করা যায়

 var details = _webcontext.products.ToList();


            if (details != null)
            {
                Parallel.ForEach(details, x =>
                {
                    Products obj = new Products();
                    obj.slno = x.slno;
                    obj.ProductName = x.ProductName;
                    obj.Price = Convert.ToInt32(x.Price);
                    li.Add(obj);

                });
                return li;
            }

টোলিস্ট () কল দেয় কিন্তু উপরের কোডটি এখনও সংযোগটি নিষ্পত্তি করে না। তাই আপনার _webcontext লাইন 1 সময় বন্ধ হচ্ছে জন্য ঝুঁকি এখনও
ধ্বনিত সল

0

আমার পরিস্থিতিতে নির্ভরতা ইনজেকশন নিবন্ধনের কারণে সমস্যাটি দেখা দিয়েছে। আমি প্রতি অনুরোধ স্কোপ পরিষেবা ইনজেকশন দিচ্ছিলাম যা একটি সিঙ্গলটন নিবন্ধিত পরিষেবায় একটি dbcontext ব্যবহার করছিল। এর জন্য dbcontext একাধিক অনুরোধের মধ্যে ব্যবহৃত হয়েছিল এবং তাই ত্রুটি।


0

আমার ক্ষেত্রে ইআরএস সংযোগ স্ট্রিংয়ের সাথে জাসন সিরিয়ালাইজেশনের সাথে ইস্যুটির কিছুই করার ছিল না। আমার প্রকল্পটি নেটকোর 2 থেকে 3 এ উন্নীত করার পরে আমি এই ত্রুটি পেয়েছি।

আরও তথ্য এখানে পাওয়া যাবে


-6

দ্বিতীয় কোয়েরির আগে নিম্নলিখিত কোডের বিভাগটি ব্যবহার করে আমি এই সমস্যার সমাধান করেছি:

 ...first query
 while (_dbContext.Connection.State != System.Data.ConnectionState.Closed)
 {
     System.Threading.Thread.Sleep(500);
 }
 ...second query

আপনি মিলি সেকেন্ডে ঘুমের সময় পরিবর্তন করতে পারেন

থ্রেড ব্যবহার করার সময় পিডি দরকারী


13
যথেচ্ছভাবে থ্রেড যুক্ত করুন any যে কোনও সমাধানের মধ্যে ঘুম হ'ল খারাপ অভ্যাস - এবং বিশেষত খারাপ হয় যখন কোনও ভিন্ন সমস্যার পাশ কাটাতে ব্যবহার করা হয় যেখানে কিছু মূল্যের অবস্থা পুরোপুরি বোঝা যায় না। আমি ভাবতাম যে প্রতিক্রিয়াটির নীচে বর্ণিত "থ্রেডস ব্যবহার করা" এর অর্থ থ্রেডিংয়ের অন্তত কিছু প্রাথমিক ধারণা থাকা উচিত - তবে এই প্রতিক্রিয়াটি কোনও প্রসঙ্গ বিবেচনায় নেয় না, বিশেষত সেই পরিস্থিতিতে যেখানে এটি খুব খারাপ ধারণা থ্রেড.স্লিপ ব্যবহার করতে - যেমন কোনও ইউআই থ্রেডে।
মাইক ট্যুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.