निम्नलिखित कोड में, मुझे पहले 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();
}
}
}
}
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();
उपरोक्त कोड में, सभी परिवर्तन एक लेनदेन में डेटाबेस पर लागू होते हैं।
SaveChanges()
को कॉल करता हूं तो मुझे वही त्रुटि मिलती है
प्रारंभिक डेटा लाने के बाद आप SaveChanges को क्यों कॉल कर रहे हैं? यदि आप उसे छोड़ देते हैं और SaveChanges को केवल एक बार कॉल करते हैं, तो अंत में, इसे काम करना चाहिए, जैसा कि हादी ने कहा था।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।
foreach(var ... in feedbackComments)
के बाहर एक एकल_context.SaveChanges();
करें। किसी क्वेरी के परिणाम पर पुनरावृति करते समय आप डेटा सहेज नहीं सकते।