निम्नलिखित कोड में, मुझे पहले foreach लूप के अंदर FeedbackComments में एक नया रिकॉर्ड जोड़ते समय _context.SaveChanges(); में एक त्रुटि प्राप्त होती है। त्रुटि New transaction is not allowed because there are other threads running in the session. है। कोई अंदाजा ऐसा क्यों हो रहा है?

BTW, मुझे वही त्रुटि मिलती रहती है जब SaveChanges बाहरी लूप के बाद केवल एक बार कॉल की जाती है।

List<FeedbackComment> feedbackComments = comments.Select(c => new FeedbackComment
{
    Id = c.Id,
    CommentText = c.Content,
    SubmissionId = submissionId,
    UserDisplayName = c.Author.DisplayName,
    DateCreated = c.CreatedTime.GetValueOrDefault(),
    FeedbackReplies = c.Replies.Select(r => new FeedbackReply
    {
        Id = r.Id,
        UserDisplayName = r.Author.DisplayName,
        ReplyText = r.Content,
        DateCreated = r.CreatedTime.GetValueOrDefault(),
        FeedbackCommentId = c.Id
    }).ToList()
}).ToList();

_context.SaveChanges();


foreach (FeedbackComment c in feedbackComments)
{
    if (!_context.FeedbackComments.Any(fc => fc.Id == c.Id))
    {
        ApplicationUser commentOwner = _context.ApplicationUsers.FirstOrDefault(au => au.GoogleDisplayName == c.UserDisplayName);

        if(commentOwner != null)
        {
            c.UserId = commentOwner.Id;

            _context.FeedbackComments.Add(c);
            newComments = true;
            _context.SaveChanges();

        }

    }


    foreach (FeedbackReply r in c.FeedbackReplies)
    {
        if (!_context.FeedbackReplies.Any(fr => fr.Id == r.Id))
        {
            ApplicationUser replyOwner = _context.ApplicationUsers.FirstOrDefault(au => au.GoogleDisplayName == c.UserDisplayName);

            if (replyOwner != null)
            {
                r.UserId = replyOwner.Id;

                _context.FeedbackReplies.Add(r);
                newComments = true;
                _context.SaveChanges();

            }
        }

    }
}
0
renakre 13 मई 2020, 13:08
संबंधित: stackoverflow.com/a/2180920/26150
 – 
Maarten
13 मई 2020, 16:25
1
वास्तव में; foreach(var ... in feedbackComments) के बाहर एक एकल _context.SaveChanges(); करें। किसी क्वेरी के परिणाम पर पुनरावृति करते समय आप डेटा सहेज नहीं सकते।
 – 
Maarten
13 मई 2020, 16:27

2 जवाब

जब आप किसी लेन-देन का उपयोग करके किसी परिवर्तन को सहेजने का प्रयास कर रहे हों, तो आपको किसी अन्य लेन-देन के पूर्ण होने तक प्रतीक्षा करनी चाहिए। दूसरी ओर, पिछले लेन-देन के पूरा होने की प्रतीक्षा में, गंभीर प्रदर्शन समस्या होती है। आपको _context.SaveChanges(); को foreach लूप के बाहर इस तरह रखना चाहिए:

foreach (FeedbackReply r in c.FeedbackReplies)
{
    if (!_context.FeedbackReplies.Any(fr => fr.Id == r.Id))
    {
        ApplicationUser replyOwner = _context.ApplicationUsers.FirstOrDefault(au => au.GoogleDisplayName == c.UserDisplayName);

        if (replyOwner != null)
        {
            r.UserId = replyOwner.Id;
            _context.FeedbackReplies.Add(r);
            newComments = true;
        }
    }
}
_context.SaveChanges();

उपरोक्त कोड में, सभी परिवर्तन एक लेनदेन में डेटाबेस पर लागू होते हैं।

0
Hadi 13 मई 2020, 14:03
आपकी प्रतिक्रिया के लिए धन्यवाद्। दुर्भाग्य से, जब मैं SaveChanges() को कॉल करता हूं तो मुझे वही त्रुटि मिलती है
 – 
renakre
13 मई 2020, 16:05
क्या आप कहीं भी एसिंक विधियों का उपयोग कर रहे हैं?
 – 
Hadi
13 मई 2020, 16:13

प्रारंभिक डेटा लाने के बाद आप SaveChanges को क्यों कॉल कर रहे हैं? यदि आप उसे छोड़ देते हैं और SaveChanges को केवल एक बार कॉल करते हैं, तो अंत में, इसे काम करना चाहिए, जैसा कि हादी ने कहा था।

0
Gamingdevil 13 मई 2020, 16:22