সত্তা ফ্রেমওয়ার্ক থেকে স্কেলএক্সসেপশন - নতুন লেনদেন অনুমোদিত নয় কারণ সেশনে অন্যান্য থ্রেড চলছে


600

আমি বর্তমানে এই ত্রুটিটি পাচ্ছি:

System.Data.SqlClient.SqlException: নতুন ট্রানজেকশন অনুমোদিত নয় কারণ সেশনে অন্যান্য থ্রেড চলছে।

এই কোড চালানোর সময়:

public class ProductManager : IProductManager
{
    #region Declare Models
    private RivWorks.Model.Negotiation.RIV_Entities _dbRiv = RivWorks.Model.Stores.RivEntities(AppSettings.RivWorkEntities_connString);
    private RivWorks.Model.NegotiationAutos.RivFeedsEntities _dbFeed = RivWorks.Model.Stores.FeedEntities(AppSettings.FeedAutosEntities_connString);
    #endregion

    public IProduct GetProductById(Guid productId)
    {
        // Do a quick sync of the feeds...
        SyncFeeds();
        ...
        // get a product...
        ...
        return product;
    }

    private void SyncFeeds()
    {
        bool found = false;
        string feedSource = "AUTO";
        switch (feedSource) // companyFeedDetail.FeedSourceTable.ToUpper())
        {
            case "AUTO":
                var clientList = from a in _dbFeed.Client.Include("Auto") select a;
                foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
                {
                    var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a;
                    foreach (RivWorks.Model.Negotiation.AutoNegotiationDetails companyFeedDetail in companyFeedDetailList)
                    {
                        if (companyFeedDetail.FeedSourceTable.ToUpper() == "AUTO")
                        {
                            var company = (from a in _dbRiv.Company.Include("Product") where a.CompanyId == companyFeedDetail.CompanyId select a).First();
                            foreach (RivWorks.Model.NegotiationAutos.Auto sourceProduct in client.Auto)
                            {
                                foreach (RivWorks.Model.Negotiation.Product targetProduct in company.Product)
                                {
                                    if (targetProduct.alternateProductID == sourceProduct.AutoID)
                                    {
                                        found = true;
                                        break;
                                    }
                                }
                                if (!found)
                                {
                                    var newProduct = new RivWorks.Model.Negotiation.Product();
                                    newProduct.alternateProductID = sourceProduct.AutoID;
                                    newProduct.isFromFeed = true;
                                    newProduct.isDeleted = false;
                                    newProduct.SKU = sourceProduct.StockNumber;
                                    company.Product.Add(newProduct);
                                }
                            }
                            _dbRiv.SaveChanges();  // ### THIS BREAKS ### //
                        }
                    }
                }
                break;
        }
    }
}

মডেল # 1 - এই মডেলটি আমাদের ডেভ সার্ভারে একটি ডাটাবেসে বসে। মডেল # 1 HTTP

মডেল # 2 - এই মডেলটি আমাদের প্রোড সার্ভারে একটি ডাটাবেসে বসে এবং স্বয়ংক্রিয় ফিডগুলির মাধ্যমে প্রতিদিন আপডেট হয়। ALT পাঠ্য

দ্রষ্টব্য - মডেল # 1 এর লাল বৃত্তাকার আইটেমগুলি ক্ষেত্রগুলি আমি মডেল # 2 তে "মানচিত্র" করতে ব্যবহার করি। দয়া করে মডেল # 2 এর লাল চেনাশোনাগুলিকে উপেক্ষা করুন: এটি আমার একটি অন্য প্রশ্ন যা এখন উত্তর পেয়েছে from

দ্রষ্টব্য: আমার এখনও একটি আইএসলেট মুছে ফেলা চেক স্থাপন করা দরকার যাতে এটি আমাদের ক্লায়েন্টের ইনভেন্টরির বাইরে চলে গেলে আমি ডিবি 1 থেকে এটিকে নরমভাবে মুছতে পারি।

এই বিশেষ কোডটি দিয়ে আমি যা যা করতে চাই তা হ'ল ডিবি 1-র কোনও সংস্থাকে ডিবি 2-র একটি ক্লায়েন্টের সাথে সংযুক্ত করা, তাদের পণ্য তালিকা ডিবি 2 থেকে পেতে এবং এটি ইতিমধ্যে সেখানে না থাকলে ডিবি 1 এ এটি লিখুন। প্রথমবারের মাধ্যমে সামগ্রীর সামগ্রীর পুরো টানা হওয়া উচিত। প্রতিবার যখন সেখানে চালানো হয় তখন কোনও কিছুই ঘটবে না যতক্ষণ না রাত্রে ফিডে নতুন জায় না আসে।

সুতরাং বড় প্রশ্ন - আমি যে লেনদেনের ত্রুটি পাচ্ছি তা কীভাবে সমাধান করব? লুপগুলির মাধ্যমে প্রতিবার আমার প্রসঙ্গটি কীভাবে ফেলে এবং পুনরায় তৈরি করা দরকার (আমার তা বোঝায় না)?


6
এটি আমি দেখেছি সবচেয়ে বিস্তারিত প্রশ্ন।

9
কেউ এখনও সঞ্চিত পদ্ধতি মিস করে?
ডেভিড

উত্তর:


690

চুল থেকে অনেক টান দেওয়ার পরে আমি আবিষ্কার করেছিলাম যে foreachলুপগুলি অপরাধী ছিল। যা হওয়ার দরকার তা হ'ল ইএফ কল করা কিন্তু এটিকে IList<T>টার্গেট টাইপের একটিতে ফিরিয়ে দিন এবং তারপরে লুপ করুন IList<T>

উদাহরণ:

IList<Client> clientList = from a in _dbFeed.Client.Include("Auto") select a;
foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
{
   var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a;
    // ...
}

14
হ্যাঁ, এটি আমারও মাথাব্যথা করে। সমস্যাটি পেয়ে আমি প্রায় আমার চেয়ার থেকে পড়ে গেলাম! আমি সমস্যার পিছনে প্রযুক্তিগত কারণগুলি বুঝতে পারি, তবে এটি স্বজ্ঞাত নয় এবং এটি বিকাশকারীকে "সাফল্যের গর্তে" পড়তে
ডক্টর জোন্স

9
বড় ডেটাসেটগুলির জন্য পারফরম্যান্সের পক্ষে কি এটি খারাপ নয়? আপনার যদি টেবিলে কয়েক মিলিয়ন রেকর্ড থাকে। ToList () তাদের সমস্তকে মেমোরিতে চুষবে। আমি এই সমস্যার মধ্যে দৌড়াচ্ছি এবং ভাবছিলাম যে নীচেরগুলি সম্ভব হবে কিনা) ক) সত্তাটি আলাদা করুন খ) একটি নতুন অবজেক্ট কনটেক্সট তৈরি করুন এবং এটির সাথে বিচ্ছিন্ন সত্তাটি সংযুক্ত করুন। গ) নতুন অবজেক্ট কনটেক্সট-এ সেভচেন্জেস () কে কল করুন ড) নতুন অবজেক্ট কনটেক্সট থেকে সত্তাটি আলাদা করুন e) পুরানো অবজেক্ট কনটেক্সট-এ আবার যুক্ত করুন
অভিজিৎ প্যাটেল

149
সমস্যাটি হ'ল আপনি SaveChangesডিবি থেকে ফলাফল আনার সময় আপনি কল করতে পারবেন না । অতএব অন্য সমাধানটি হল লুপটি শেষ হয়ে গেলে পরিবর্তনগুলি সংরক্ষণ করা।
ড্র নোকস

4
কামড় দেওয়ার পরেও, আমি এটি মাইক্রোসফ্ট সংযোগে যুক্ত করেছি: সংযুক্ত.মাইক্রোসফট / ভিজুয়ালস্টুডিও / ফেডব্যাক / ডিটেলস / 12১২৩69 / / এটিকে বিনা দ্বিধায় ভোট দিন।
আয়ান মারসার

36
আমাদের ডেভগুলি পরিণতি সম্পর্কে চিন্তা না করে যে কোনও লিনকিউ ক্যোয়ারিতে টোলিস্ট () যুক্ত করতে থাকে। এটি অবশ্যই প্রথমবার সংযোজন করা উচিত। টোললিস্ট () সত্যিই দরকারী!
মার্চ

266

যেমন আপনি ইতিমধ্যে সনাক্ত করেছেন, আপনি foreachএখনও সক্রিয় পাঠকের মাধ্যমে ডাটাবেস থেকে আঁকা এমন একটির মধ্যে সংরক্ষণ করতে পারবেন না ।

ছোট ডেটা সেটগুলির জন্য কল করা ToList()বা ToArray()জরিমানা, তবে যখন আপনার কয়েক হাজার সারি থাকবে, আপনি প্রচুর পরিমাণে স্মৃতি গ্রহণ করবেন।

খণ্ডগুলিতে সারিগুলি লোড করা ভাল।

public static class EntityFrameworkUtil
{
    public static IEnumerable<T> QueryInChunksOf<T>(this IQueryable<T> queryable, int chunkSize)
    {
        return queryable.QueryChunksOfSize(chunkSize).SelectMany(chunk => chunk);
    }

    public static IEnumerable<T[]> QueryChunksOfSize<T>(this IQueryable<T> queryable, int chunkSize)
    {
        int chunkNumber = 0;
        while (true)
        {
            var query = (chunkNumber == 0)
                ? queryable 
                : queryable.Skip(chunkNumber * chunkSize);
            var chunk = query.Take(chunkSize).ToArray();
            if (chunk.Length == 0)
                yield break;
            yield return chunk;
            chunkNumber++;
        }
    }
}

উপরের এক্সটেনশন পদ্ধতিগুলি দেওয়া, আপনি নিজের ক্যোয়ারীটি এভাবে লিখতে পারেন:

foreach (var client in clientList.OrderBy(c => c.Id).QueryInChunksOf(100))
{
    // do stuff
    context.SaveChanges();
}

আপনি যে পদ্ধতিতে এই পদ্ধতিটি কল করেন সেটিকে অবশ্যই অর্ডার করতে হবে। এটি কারণ হ'ল সত্ত্বা ফ্রেমওয়ার্ক কেবলমাত্র IQueryable<T>.Skip(int)অর্ডার করা প্রশ্নের উপর সমর্থন করে, আপনি যখন বিবেচনা করেন যে বিভিন্ন রেঞ্জের একাধিক প্রশ্নের ক্রম স্থিতিশীল হওয়া দরকার। যদি অর্ডারটি আপনার পক্ষে গুরুত্বপূর্ণ না হয় তবে কেবল প্রাথমিক কী দ্বারা অর্ডার করুন কারণ এটি ক্লাস্টারড সূচক হওয়ার সম্ভাবনা রয়েছে।

এই সংস্করণটি 100 ব্যাচের ডাটাবেসগুলিকে জিজ্ঞাসা করবে Note নোটটি SaveChanges()প্রতিটি সত্তার জন্য বলা হয়।

আপনি যদি আপনার থ্রুপুট নাটকীয়ভাবে উন্নত করতে চান তবে আপনার SaveChanges()কম ঘন ঘন কল করা উচিত । পরিবর্তে এই জাতীয় কোড ব্যবহার করুন:

foreach (var chunk in clientList.OrderBy(c => c.Id).QueryChunksOfSize(100))
{
    foreach (var client in chunk)
    {
        // do stuff
    }
    context.SaveChanges();
}

এর ফলে 100 গুণ কম ডাটাবেস আপডেট কল আসে। অবশ্যই এই কলগুলির মধ্যে প্রতিটি সম্পূর্ণ হতে আরও বেশি সময় নেয় তবে আপনি এখনও শেষের দিকে এগিয়ে আসেন। আপনার মাইলেজ পরিবর্তিত হতে পারে, তবে এটি আমার জন্য ওয়ার্ল্ডস দ্রুত ছিল।

এবং এটি আপনি যে ব্যতিক্রম দেখছিলেন তার চারপাশে চলে আসে।

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

প্রথম লুপটিতে কোনও কিছু এড়ানো প্রয়োজন হয় না, তাই সহজ।

SELECT TOP (100)                     -- the chunk size 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
FROM [dbo].[Clients] AS [Extent1]
ORDER BY [Extent1].[Id] ASC

পরবর্তী কলগুলিতে ফলাফলের পূর্ববর্তী অংশগুলি এড়ানো প্রয়োজন, সুতরাং এর ব্যবহার প্রবর্তন করে row_number:

SELECT TOP (100)                     -- the chunk size
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
FROM (
    SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], row_number()
    OVER (ORDER BY [Extent1].[Id] ASC) AS [row_number]
    FROM [dbo].[Clients] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 100   -- the number of rows to skip
ORDER BY [Extent1].[Id] ASC

17
ধন্যবাদ। আপনার উত্তরটি "উত্তরযুক্ত" হিসাবে চিহ্নিত চিহ্নের চেয়ে অনেক বেশি কার্যকর ছিল।
ওয়াগনার দা সিলভা 23

1
এটা অসাধারণ. কেবল একটি জিনিস: আপনি যদি একটি কলামে অনুসন্ধান করছেন এবং সেই কলামটির মান আপডেট করছেন, আপনার খণ্ডনম্বার ++ সম্পর্কে সতর্কতা অবলম্বন করা উচিত; । ধরা যাক আপনার একটি কলাম "ModifiedDate" আছে এবং আপনি অনুসন্ধান করছেন W কোথায় (x => x.ModifiedDate! = নাল), এবং অগ্রগতির শেষে আপনি ModifiedDate এর জন্য একটি মান সেট করেছেন set এইভাবে আপনি অর্ধেক রেকর্ড পুনরাবৃত্তি করছেন না কারণ অর্ধেক রেকর্ড বাদ পড়েছে।
আরভান্দ


আমি এই কাজ করা উচিত। var skip = 0; const int take = 100; <Employee> এম্পস তালিকা; while ((এম্পস = ডিবি। এমপ্লয়য়েস.সকিপ (এড়িয়ে যান) T। গ্রহণ করুন (নিন) o টোললিস্ট ()) গণনা> 0) ip এড়িয়ে যান + = নিন; ভবিষ্যদ্বাণী (এম্পসগুলিতে বৈষম্য) {// এখানে স্টাফ করুন} this আমি এটি একটি উত্তর তৈরি করব তবে এটি নীচের উত্তরগুলির স্তূপের নীচে দাফন করা হবে এবং এটি এই প্রশ্নের সাথে সম্পর্কিত।
jwize

123

আমরা এখন কানেক্টে খোলা বাগটির একটি সরকারী প্রতিক্রিয়া পোস্ট করেছি । আমরা প্রস্তাবিত কাজের ক্ষেত্রগুলি নিম্নরূপ:

এই ত্রুটিটি সেভচেনজেস () কল চলাকালীন সত্তা ফ্রেমওয়ার্ক একটি অন্তর্নিহিত লেনদেন তৈরি করার কারণে। ত্রুটিটি ঘিরে কাজ করার সর্বোত্তম উপায় হ'ল ভিন্ন ধরণটি ব্যবহার করা (অর্থাত্ পাঠের মাঝে সংরক্ষণ না করা) বা স্পষ্টভাবে কোনও লেনদেন ঘোষণার মাধ্যমে। এখানে তিনটি সম্ভাব্য সমাধান রয়েছে:

// 1: Save after iteration (recommended approach in most cases)
using (var context = new MyContext())
{
    foreach (var person in context.People)
    {
        // Change to person
    }
    context.SaveChanges();
}

// 2: Declare an explicit transaction
using (var transaction = new TransactionScope())
{
    using (var context = new MyContext())
    {
        foreach (var person in context.People)
        {
            // Change to person
            context.SaveChanges();
        }
    }
    transaction.Complete();
}

// 3: Read rows ahead (Dangerous!)
using (var context = new MyContext())
{
    var people = context.People.ToList(); // Note that this forces the database
                                          // to evaluate the query immediately
                                          // and could be very bad for large tables.

    foreach (var person in people)
    {
        // Change to person
        context.SaveChanges();
    }
} 

6
আপনি যদি লেনদেনের রুটটি গ্রহণ করেন, কেবলমাত্র একটি ট্রানজেকশনস্কোপে নিক্ষেপ করা এটি ঠিক করতে পারে না - আপনি যা করছেন তা দীর্ঘ সময় নিতে পারে যদি সময়সীমা প্রসারিত করতে ভুলবেন না - উদাহরণস্বরূপ যদি আপনি ইন্টারেক্টিভভাবে কোডটি তৈরি করে ডিবাগ করছেন ডিবি কল। লেনদেনের সময়সীমা এক ঘন্টা বাড়িয়ে দেওয়ার জন্য এখানে কোড দেওয়া হয়েছে: ব্যবহার করে (
ভ্যারানজেকশন

"টিউটোরিয়াল পথ" থেকে আমি নিজেই সত্যিকারের উদাহরণে স্থান পেয়েছি আমি এই ত্রুটিটি প্রথমবারের মতো ছুঁড়েছি! আমার জন্য, তবে সহজ সমাধান, তথ্য সংরক্ষণের পরে সংরক্ষণ করুন, আরও ভাল! (আমি মনে করি 99% বারের ক্ষেত্রে এটি হয় এবং লুপের ভিতরে কেবল 1 %ই একটি ডাটাবেস করতে হবে)
স্পাইডারম্যান

স্থূল. আমি কেবল এই ত্রুটি ঘুচিয়েছি। খুব বাজে। ২ য় পরামর্শটি আমার সেভচেন্জেসকে লুপে সরানোর পাশাপাশি আমার জন্য আকর্ষণীয় কাজ করেছিল। আমি ভেবেছিলাম লুপের বাইরে পরিবর্তনগুলি সংরক্ষণ করা ব্যাচিং পরিবর্তনগুলির জন্য ভাল। তবে ঠিক আছে। আমি মনে করি না?! :(
মিঃ ইয়ং

আমার জন্য কাজ করেনি। নেট 4.5। লেনদেনস্কোপটি ব্যবহার করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি "এনলিস্টট্রান্সঅ্যাকশনে অন্তর্নিহিত সরবরাহকারী ব্যর্থ।" অংশীদারী লেনদেন পরিচালক দূরবর্তী / নেটওয়ার্ক লেনদেনের জন্য এর সমর্থনটিকে অক্ষম করে দিয়েছেন। (এইচআরসিলেট থেকে ব্যতিক্রম: 0x8004D025) "}"। আমি পুনরাবৃত্তির বাইরে কাজটি শেষ করি।
দিগন্ত কুমার

লেনদেনস্কোপ ব্যবহার করা বিপজ্জনক, কারণ পুরো লেনদেনের সময়কালের জন্য টেবিলটি লক থাকে।
মাইকেল ফ্রেইজিম

19

প্রকৃতপক্ষে আপনি foreachসত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করে সি # তে একটি লুপের মধ্যে পরিবর্তনগুলি সংরক্ষণ করতে পারবেন না ।

context.SaveChanges() পদ্ধতিটি নিয়মিত ডাটাবেস সিস্টেমের (আরডিএমএস) প্রতিশ্রুতিবদ্ধতার মতো কাজ করে।

কেবলমাত্র সমস্ত পরিবর্তন করুন (যা সত্তা ফ্রেমওয়ার্ক ক্যাশে করবে) এবং তারপরে SaveChanges()লুপের পরে কল করার পরে সেগুলির সমস্ত সংরক্ষণ করুন (এর বাইরে), ডাটাবেস কমিট কমান্ডের মতো।

আপনি যদি একবারে সমস্ত পরিবর্তনগুলি সংরক্ষণ করতে পারেন তবে এটি কাজ করে।


2
আমি এখানে "নিয়মিত ডাটাবেস সিস্টেম (
আরডিএমএস

1
এটি ভুল বলে মনে হচ্ছে, যেহেতু বারবার SaveChanges কল করা EF এর 90% প্রসঙ্গে ভাল।
Pxtl

মনে হচ্ছে বার বার SaveChanges কল করা ঠিক আছে, যদি না পূর্ববর্তী লুপটি একটি ডিবি সত্তার উপর পুনরাবৃত্তি করে।
kerbasaurus

1
আহা! প্রতিটি লুপের জন্য প্রসঙ্গ আনুন! (পিএফফুট ... আমি কী ভাবছিলাম? ..) ধন্যবাদ!
অ্যাডাম কক্স

18

শুধু করা context.SaveChanges()আপনার শেষে foreach(লুপ)।


এই আমি ভিতরে foreach সংরক্ষণ কারণে আমার ক্ষেত্রে খুঁজে পাওয়া যায় নি ভাল বিকল্প
আলমেইডা

2
এটি সর্বদা একটি বিকল্প নয়।
Pxtl

9

সর্বদা আপনার নির্বাচন তালিকা হিসাবে ব্যবহার করুন

উদাহরণ:

var tempGroupOfFiles = Entities.Submited_Files.Where(r => r.FileStatusID == 10 && r.EventID == EventId).ToList();

তারপরে পরিবর্তনগুলি সংরক্ষণের সময় সংগ্রহের মাধ্যমে লুপ করুন

 foreach (var item in tempGroupOfFiles)
             {
                 var itemToUpdate = item;
                 if (itemToUpdate != null)
                 {
                     itemToUpdate.FileStatusID = 8;
                     itemToUpdate.LastModifiedDate = DateTime.Now;
                 }
                 Entities.SaveChanges();

             }

1
এটি মোটেই ভাল অনুশীলন নয়। আপনার সেভচেন্জেসগুলি সম্পাদন করা উচিত নয় যা প্রায়শই আপনার প্রয়োজন হয় না এবং আপনার অবশ্যই "তালিকা হিসাবে সর্বদা আপনার নির্বাচনটি ব্যবহার করা উচিত নয়"
ডিনারডো

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

@ jstuardo এমনকি ব্যাচিংয়ের সাথেও?
ডিনারডো

@ ডিনার্ডো আমি সম্মত হলাম এটি দার্শনিক স্তরে কোনও ভাল অনুশীলন নয়। যাইহোক, বেশ কয়েকটি পরিস্থিতি বিদ্যমান যেখানে ফর্ম লুপের ভিতরে কোডটি অন্য পদ্ধতিতে কল করে (আসুন একটি অ্যাডটলগ () পদ্ধতিটি বলি) যার মধ্যে স্থানীয়ভাবে db.SaveChanges () এ কল রয়েছে। এই পরিস্থিতিতে আপনি সত্যিই db- তে কল নিয়ন্ত্রণ করতে পারবেন না ave পরিবর্তনগুলি সংরক্ষণ করুন। এক্ষেত্রে, টোলিস্ট () বা অনুরূপ স্ট্রাক্ট ব্যবহার করা এমজোনারজের পরামর্শ অনুসারে কাজ করবে। ধন্যবাদ!
উ: ভার্মা

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

8

এফওয়াইআই: একটি বই এবং কিছু লাইন থেকে সামঞ্জস্য করা হয়েছে কারণ এটির পুরোপুরি বৈধতা:

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

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

কখনও কখনও বিষয়গুলি কেন ঘটছে তা বোঝা ভাল ;-)


1
এটি এড়ানোর একটি ভাল উপায় হ'ল যখন আপনার পাঠক দ্বিতীয় খোলার জন্য উন্মুক্ত থাকে এবং সেই ক্রিয়াকলাপগুলি দ্বিতীয় পাঠকের মধ্যে রাখে। সত্তা ফ্রেমওয়ার্কে মাস্টার / বিশদ আপডেট করার সময় এটি আপনার প্রয়োজন হতে পারে। আপনি মাস্টার রেকর্ডের জন্য প্রথম সংযোগটি এবং বিশদ রেকর্ডের জন্য দ্বিতীয়টি খুলুন। আপনি যদি কেবল পড়ছেন তবে সমস্যা নেই be আপডেট করার সময় সমস্যাগুলি দেখা দেয়।
হারমান ভ্যান ডের ব্লুম

সহায়ক ব্যাখ্যা। আপনি ঠিক বলেছেন, কেন ঘটনা ঘটছে তা বোঝা ভাল।
ডভ মিলার

8

.ToList () এ আপনার অনুসন্ধানযোগ্য তালিকা তৈরি করা এবং এটি ঠিকঠাক কাজ করা উচিত।


1
দয়া করে একটি সমাধান পোস্ট করার পরিবর্তে একটি উদাহরণ সরবরাহ করুন।
রনি ওস্টিং

5

আমি এই একই সমস্যা পেয়ে যাচ্ছিলাম তবে অন্য পরিস্থিতিতে a আমার একটি তালিকার বাক্সে আইটেমগুলির একটি তালিকা ছিল। ব্যবহারকারী একটি আইটেম ক্লিক করতে পারেন এবং মুছুন নির্বাচন করতে পারেন তবে আমি আইটেমটি মোছার জন্য একটি সঞ্চিত প্রকট ব্যবহার করছি কারণ আইটেমটি মোছার সাথে যুক্তি রয়েছে of আমি যখন সঞ্চিত প্রোকে কল করি তখন মুছুন ঠিকঠাক কাজ করে তবে সেভচেনজেজে ভবিষ্যতের যে কোনও কল ত্রুটির কারণ ঘটবে। আমার সমাধানটি ছিল EF এর বাইরে সঞ্চিত প্রোকে কল করা এবং এটি দুর্দান্ত কাজ করেছিল। কোনও কারণে যখন আমি স্টেফ করা প্রোককে EF পদ্ধতিতে কাজ করার জন্য কল করি তখন এটি কিছু খোলা ছেড়ে দেয়।


3
সম্প্রতি অনুরূপ সমস্যা ছিল: আমার ক্ষেত্রে কারণটি ছিল SELECTসঞ্চিত পদ্ধতিতে বিবৃতি যা খালি ফলাফল সেট তৈরি করেছিল এবং যদি ফলাফল ফলাফলটি পড়া না হয়, তবে SaveChangesসেই ব্যতিক্রম ছুঁড়ে ফেলেছে।
n0rd

এসপি থেকে অপঠিত ফলাফল সহ একই জিনিস, ইঙ্গিতটির জন্য অনেক ধন্যবাদ)
পাভেল কে

4

এখানে আরও 2 টি বিকল্প রয়েছে যা আপনাকে প্রতিটি লুপের জন্য একটিতে SaveChanges () চালনার অনুমতি দেয়।

প্রথম বিকল্পটি হ'ল আপনার তালিকার অবজেক্টগুলি পুনরাবৃত্ত করার জন্য একটি ডিবিসিওন্টেক্সট ব্যবহার করুন এবং তারপরে সেভচেনজেস () কল করতে একটি 2 তম ডিবিসিএনটেক্সট তৈরি করুন। এখানে একটি উদাহরণ:

//Get your IQueryable list of objects from your main DBContext(db)    
IQueryable<Object> objects = db.Object.Where(whatever where clause you desire);

//Create a new DBContext outside of the foreach loop    
using (DBContext dbMod = new DBContext())
{   
    //Loop through the IQueryable       
    foreach (Object object in objects)
    {
        //Get the same object you are operating on in the foreach loop from the new DBContext(dbMod) using the objects id           
        Object objectMod = dbMod.Object.Find(object.id);

        //Make whatever changes you need on objectMod
        objectMod.RightNow = DateTime.Now;

        //Invoke SaveChanges() on the dbMod context         
        dbMod.SaveChanges()
    }
}

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

//Get the list of objects you want from your DBContext, and select just the Id's and create a list
List<int> Ids = db.Object.Where(enter where clause here)Select(m => m.Id).ToList();

var objects = Ids.Select(id => db.Objects.Find(id));

foreach (var object in objects)
{
    object.RightNow = DateTime.Now;
    db.SaveChanges()
}

এটি একটি দুর্দান্ত বিকল্প যা আমি ভেবেছিলাম এবং করেছি, তবে এটির উজ্জীবিত হওয়া দরকার। দ্রষ্টব্য: i) আপনি গণনা হিসাবে পুনরাবৃত্তি করতে পারেন যা খুব বড় সেটগুলির জন্য ভাল; ii) আপনি এতগুলি রেকর্ড লোড করতে সমস্যা এড়াতে NoTracking কমান্ডটি ব্যবহার করতে পারেন (যদি এটি আপনার পরিস্থিতি হয়); iii) আমি প্রাইমারি-কী-এর একমাত্র বিকল্পটিও পছন্দ করি - এটি খুব স্মার্ট কারণ আপনি মেমরিতে অনেক কম ডেটা লোড করছেন, তবে আপনি কোনও সম্ভাব্য গতিশীল আন্ডারলাইং ডেটাসেটের জন্য টেক / স্কিপ নিয়ে কাজ করছেন না।
টড

4

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

উদাহরণ স্বরূপ

    using (var context = new DatabaseContext())
    {
        ...
        using (var context1 = new DatabaseContext())
        {
            ...
               context1.SaveChanges();
        }                         
        //get id of inserted object from context1 and use is.   
      context.SaveChanges();
   }

2

সুতরাং প্রকল্পে আমার এই ঠিক একই সমস্যাটি ছিল সমস্যাটি ছিল না foreachবা .toList()এটি আসলে আমাদের ব্যবহৃত অটোফ্যাক কনফিগারেশনে ছিল। এটি কিছু অদ্ভুত পরিস্থিতি তৈরি করেছিল উপরের ত্রুটিটি নিক্ষেপ করা হয়েছিল তবে অন্যান্য সমমানের ত্রুটিগুলিও ফেলে দেওয়া হয়েছিল।

এটি আমাদের স্থির ছিল: এটি পরিবর্তন হয়েছে:

container.RegisterType<DataContext>().As<DbContext>().InstancePerLifetimeScope();
container.RegisterType<DbFactory>().As<IDbFactory>().SingleInstance();
container.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();

প্রতি:

container.RegisterType<DataContext>().As<DbContext>().As<DbContext>();
container.RegisterType<DbFactory>().As<IDbFactory>().As<IDbFactory>().InstancePerLifetimeScope();
container.RegisterType<UnitOfWork>().As<IUnitOfWork>().As<IUnitOfWork>();//.InstancePerRequest();

সমস্যাটি কী মনে হয়েছিল আপনি কী তা ব্যাখ্যা করতে পারেন? আপনি প্রতিবার নতুন ডিবিকন্টেক্সট তৈরি করে সমাধান করেছেন?
ইরান otzap

2

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি আজ এই ত্রুটির মুখোমুখি হয়েছি।

এবং আমি দেখতে পেয়েছি যে, কোনও ডাটাবেস টেবিল ট্রিগার ত্রুটি পেলে এই ত্রুটিটি ছুঁড়ে ফেলা যায়।

আপনার তথ্যের জন্য, আপনি যখন এই ত্রুটিটি পান তখন আপনি আপনার টেবিলগুলিও ট্রিগারগুলি পরীক্ষা করতে পারেন।


2

আমার একটি বিশাল রেজাল্টসেট পড়ার এবং টেবিলের কিছু রেকর্ড আপডেট করার দরকার ছিল। আমি হিসাবে প্রস্তাবিত ব্যবহার খন্ডে করার চেষ্টা ড্রিউ Noakes এর উত্তর

দুর্ভাগ্যক্রমে 50000 রেকর্ডের পরে আমি আউট অফ মেমরিএক্সসেপশন পেয়েছি। উত্তর সত্ত্বা ফ্রেমওয়ার্ক বড় ডেটা সেট, মেমরি ব্যতিক্রম ছাড়াই ব্যাখ্যা করে, এটি

ইএফ ডেটাটির দ্বিতীয় অনুলিপি তৈরি করে যা পরিবর্তন সনাক্তকরণের জন্য ব্যবহার করে (যাতে এটি ডাটাবেসে পরিবর্তনগুলি বহাল রাখতে পারে)। EF প্রসঙ্গের আজীবন এই দ্বিতীয় সেটটি ধারণ করে এবং এটি আপনাকে এই স্মৃতি থেকে বাদ দিয়ে চলেছে set

সুপারিশটি হ'ল প্রতিটি ব্যাচের জন্য আপনার প্রসঙ্গটি পুনরায় তৈরি করা।

সুতরাং আমি প্রাথমিক কী-এর ন্যূনতম এবং সর্বাধিক মানগুলি পুনরুদ্ধার করেছি- টেবিলগুলিতে অটো ইনক্রিমেন্টাল পূর্ণসংখ্যা হিসাবে প্রাথমিক কী রয়েছে hen তখন আমি প্রতিটি খণ্ডের প্রসঙ্গ খোলার মাধ্যমে রেকর্ডের ডাটাবেস খণ্ডগুলি থেকে উদ্ধার করেছি। প্রক্রিয়া করার পরে খণ্ড প্রসঙ্গটি বন্ধ হয়ে যায় এবং মেমরি প্রকাশ করে। এটি নিশ্চিত করে যে মেমরির ব্যবহার বাড়ছে না।

নীচে আমার কোড থেকে একটি স্নিপেট রয়েছে:

  public void ProcessContextByChunks ()
  {
        var tableName = "MyTable";
         var startTime = DateTime.Now;
        int i = 0;
         var minMaxIds = GetMinMaxIds();
        for (int fromKeyID= minMaxIds.From; fromKeyID <= minMaxIds.To; fromKeyID = fromKeyID+_chunkSize)
        {
            try
            {
                using (var context = InitContext())
                {   
                    var chunk = GetMyTableQuery(context).Where(r => (r.KeyID >= fromKeyID) && (r.KeyID < fromKeyID+ _chunkSize));
                    try
                    {
                        foreach (var row in chunk)
                        {
                            foundCount = UpdateRowIfNeeded(++i, row);
                        }
                        context.SaveChanges();
                    }
                    catch (Exception exc)
                    {
                        LogChunkException(i, exc);
                    }
                }
            }
            catch (Exception exc)
            {
                LogChunkException(i, exc);
            }
        }
        LogSummaryLine(tableName, i, foundCount, startTime);
    }

    private FromToRange<int> GetminMaxIds()
    {
        var minMaxIds = new FromToRange<int>();
        using (var context = InitContext())
        {
            var allRows = GetMyTableQuery(context);
            minMaxIds.From = allRows.Min(n => (int?)n.KeyID ?? 0);  
            minMaxIds.To = allRows.Max(n => (int?)n.KeyID ?? 0);
        }
        return minMaxIds;
    }

    private IQueryable<MyTable> GetMyTableQuery(MyEFContext context)
    {
        return context.MyTable;
    }

    private  MyEFContext InitContext()
    {
        var context = new MyEFContext();
        context.Database.Connection.ConnectionString = _connectionString;
        //context.Database.Log = SqlLog;
        return context;
    }

FromToRange একটি সহজ কাঠামো যা থেকে এবং এর বৈশিষ্ট্যগুলিতে।


আপনি কীভাবে আপনার প্রসঙ্গে "পুনর্নবীকরণ" করছেন তা দেখতে আমি ব্যর্থ হয়েছি। দেখে মনে হচ্ছে আপনি প্রতিটি খণ্ডের জন্য কেবল একটি নতুন প্রসঙ্গ তৈরি করছেন।
সানক্যাট 2000

@ Suncat2000, আপনি সঠিক হয়, প্রসঙ্গ একটি স্বল্প জীবন্ত বস্তুর হওয়া উচিত stackoverflow.com/questions/43474112/...
মাইকেল Freidgeim

1

আমিও একই সমস্যার মুখোমুখি ছিলাম।

এখানে কারণ এবং সমাধান।

http://blogs.msdn.com/b/cbiyikoglu/archive/2006/11/21/mars-transactions-and-sql-error-3997-3988-or-3983.aspx

সন্নিবেশ, আপডেটের মতো ডেটা ম্যানিপুলেশন কমান্ডগুলি ফায়ার করার আগে নিশ্চিত হয়ে নিন যে আপনি পূর্ববর্তী সমস্ত সক্রিয় এসকিউএল পাঠককে বন্ধ করে দিয়েছেন।

সর্বাধিক সাধারণ ত্রুটি হ'ল ফাংশন যা ডিবি এবং রিটার্ন মানগুলি থেকে ডেটা পড়ে। যেমন --RecordExist মত ফাংশনগুলির জন্য।

এই ক্ষেত্রে আমরা রেকর্ডটি খুঁজে পাই এবং পাঠকটি বন্ধ করতে ভুলে গেলে আমরা তত্ক্ষণাত ফাংশন থেকে ফিরে আসি।


7
সত্তা ফ্রেমওয়ার্কে "একটি পাঠককে ক্লোজ করা" এর অর্থ কী? MyDb. গ্রাহকগণের যেখানে গ্রাহকআইআরআইডি == গ্রাহক নির্বাচিত গ্রাহক থেকে বার রেজাল্ট = এর মতো কোনও ক্যোয়ারীতে দৃশ্যমান পাঠক নেই; রিটার্ন ফলাফল। প্রথমআরডিফল্ট ();
অ্যান্টনি

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

1

নীচের কোডটি আমার পক্ষে কাজ করে:

private pricecheckEntities _context = new pricecheckEntities();

...

private void resetpcheckedtoFalse()
{
    try
    {
        foreach (var product in _context.products)
        {
            product.pchecked = false;
            _context.products.Attach(product);
            _context.Entry(product).State = EntityState.Modified;
        }
        _context.SaveChanges();
    }
    catch (Exception extofException)
    {
        MessageBox.Show(extofException.ToString());

    }
    productsDataGrid.Items.Refresh();
}

2
তাই আপনাকে স্বাগতম! এটি আপনার জন্য কেন কাজ করে তা বর্ণনা করে একটি ব্যাখ্যা এবং / অথবা লিঙ্ক যুক্ত করার বিষয়ে বিবেচনা করুন । কেবলমাত্র কোডের উত্তরগুলি সাধারণত এসও এর জন্য ভাল মানের নয় বলে বিবেচিত হয়।
কোডমাজিক

1

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

public bool IsUserInRole(string username, string roleName, DataContext context)
{          
   var result = context.aspnet_UsersInRoles_IsUserInRoleEF("/", username, roleName);

   //using here solved the issue
   using (var en = result.GetEnumerator()) 
   {
     if (!en.MoveNext())
       throw new Exception("emty result of aspnet_UsersInRoles_IsUserInRoleEF");
     int? resultData = en.Current;

     return resultData == 1;//1 = success, see T-SQL for return codes
   }
}

1

EF5 থেকে EF6 এ স্থানান্তরিত হওয়ার পরে আমরা এই ত্রুটিটি দেখতে শুরু করেছি "নতুন লেনদেনের অনুমতি নেই কারণ সেশনে অন্যান্য থ্রেড চলছে"

গুগল আমাদের এখানে এনেছে কিন্তু আমরা কল দিচ্ছি না SaveChanges() লুপের মধ্যে দিচ্ছি না। ডিবি থেকে ফোরচ লুপের অভ্যন্তরে অবজেক্টকন্টেক্সটেক্সেক্সটফানশন ব্যবহার করে কোনও সঞ্চিত পদ্ধতি কার্যকর করার সময় ত্রুটিগুলি উত্থাপিত হয়েছিল।

অবজেক্টকন্টেক্সটে যে কোনও কল x ইতিমধ্যে একটি উন্মুক্ত পাঠক থাকাকালীন একটি লেনদেন শুরু করা ত্রুটির কারণ ঘটায়।

নিম্নলিখিত বিকল্পটি সেট করে কোনও লেনদেনে এসপি মোড়ানো অক্ষম করা সম্ভব।

_context.Configuration.EnsureTransactionsForFunctionsAndCommands = false;

EnsureTransactionsForFunctionsAndCommandsবিকল্প নিজস্ব লেনদেনের তৈরি ছাড়া চালানোর জন্য এসপি দেয় এবং ত্রুটি আর উত্থাপিত হয়।

DbContextConfigration.EnsureTransferencesFunificationsAndCommands সম্পত্তি


0

আমি পার্টিতে অনেক দেরি করেছি কিন্তু আজ আমি একই ত্রুটির মুখোমুখি হয়েছি এবং কীভাবে সমাধান করেছি তা সহজ ছিল। আমার পরিস্থিতি এই প্রদত্ত কোডের অনুরূপ ছিল যা আমি প্রতিটি লুপের জন্য নেস্টের ভিতরে ডিবি লেনদেন করছিলাম।

সমস্যাটি হ'ল একক ডিবি লেনদেনের জন্য প্রতিটি লুপের জন্য কিছুটা সময় বেশি সময় নেয় তাই পূর্ববর্তী লেনদেনটি সম্পূর্ণ না হয়ে গেলে নতুন ট্র্যাকশন ব্যতিক্রম ছুঁড়ে দেয়, সুতরাং সমাধানটি প্রতিটি লুপে একটি নতুন অবজেক্ট তৈরি করা হয় যেখানে আপনি একটি ডিবি লেনদেন করছেন।

উপরের উল্লিখিত পরিস্থিতিগুলির জন্য সমাধানটি এরকম হবে:

foreach (RivWorks.Model.Negotiation.AutoNegotiationDetails companyFeedDetail in companyFeedDetailList)
                {
private RivWorks.Model.Negotiation.RIV_Entities _dbRiv = RivWorks.Model.Stores.RivEntities(AppSettings.RivWorkEntities_connString);
                    if (companyFeedDetail.FeedSourceTable.ToUpper() == "AUTO")
                    {
                        var company = (from a in _dbRiv.Company.Include("Product") where a.CompanyId == companyFeedDetail.CompanyId select a).First();
                        foreach (RivWorks.Model.NegotiationAutos.Auto sourceProduct in client.Auto)
                        {
                            foreach (RivWorks.Model.Negotiation.Product targetProduct in company.Product)
                            {
                                if (targetProduct.alternateProductID == sourceProduct.AutoID)
                                {
                                    found = true;
                                    break;
                                }
                            }
                            if (!found)
                            {
                                var newProduct = new RivWorks.Model.Negotiation.Product();
                                newProduct.alternateProductID = sourceProduct.AutoID;
                                newProduct.isFromFeed = true;
                                newProduct.isDeleted = false;
                                newProduct.SKU = sourceProduct.StockNumber;
                                company.Product.Add(newProduct);
                            }
                        }
                        _dbRiv.SaveChanges();  // ### THIS BREAKS ### //
                    }
                }

0

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

আমি জানতে পারি যে আমার জিজ্ঞাসাটি ভুল ছিল এবং সেখানে 250+ এর বেশি সম্পাদনা মুলতুবি রয়েছে। সুতরাং আমি আমার প্রশ্নের সংশোধন করেছি, এবং এখন এটি সঠিকভাবে কাজ করে।

সুতরাং আমার পরিস্থিতিতে: ত্রুটিগুলির জন্য ক্যোয়ারীটি পরীক্ষা করুন, ফলাফলটি ডিবাগ করে কোয়েরিটি ফিরে আসে। এরপরে কোয়েরিটি সঠিক করুন।

আশা করি এটি ভবিষ্যতের সমস্যা সমাধানে সহায়তা করবে।

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