มี DataReader แบบเปิดที่เชื่อมโยงกับคำสั่งนี้อยู่แล้วซึ่งจะต้องปิดก่อน


640

ฉันมีคำถามนี้และฉันได้รับข้อผิดพลาดในฟังก์ชั่นนี้:

var accounts = from account in context.Accounts
               from guranteer in account.Gurantors
               select new AccountsReport
               {
                   CreditRegistryId = account.CreditRegistryId,
                   AccountNumber = account.AccountNo,
                   DateOpened = account.DateOpened,
               };

 return accounts.AsEnumerable()
                .Select((account, index) => new AccountsReport()
                    {
                        RecordNumber = FormattedRowNumber(account, index + 1),
                        CreditRegistryId = account.CreditRegistryId,
                        DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
                        AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
                    })
                .OrderBy(c=>c.FormattedRecordNumber)
                .ThenByDescending(c => c.StateChangeDate);


public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
    return (from h in context.AccountHistory
            where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
            select h.LastUpdated).Max();
}

ข้อผิดพลาดคือ:

มี DataReader แบบเปิดที่เชื่อมโยงกับคำสั่งนี้อยู่แล้วซึ่งจะต้องปิดก่อน

ปรับปรุง:

เพิ่มการติดตามสแต็ก:

InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.]
   System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +5008639
   System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23
   System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
   System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443

[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]
   System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479
   System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +683
   System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +119
   System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +38
   System.Linq.Enumerable.Single(IEnumerable`1 source) +114
   System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3(IEnumerable`1 sequence) +4
   System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +29
   System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +91
   System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +69
   System.Linq.Queryable.Max(IQueryable`1 source) +216
   CreditRegistry.Repositories.CreditRegistryRepository.DateLastUpdated(Int64 creditorRegistryId, String accountNo) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1497
   CreditRegistry.Repositories.CreditRegistryRepository.<AccountDetails>b__88(AccountsReport account, Int32 index) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1250
   System.Linq.<SelectIterator>d__7`2.MoveNext() +198
   System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217
   System.Linq.<GetEnumerator>d__0.MoveNext() +96

คำตอบ:


1287

สิ่งนี้อาจเกิดขึ้นได้หากคุณเรียกใช้คิวรีในขณะที่วนซ้ำผลลัพธ์จากคิวรีอื่น ไม่ชัดเจนจากตัวอย่างของคุณที่เกิดขึ้นเพราะตัวอย่างไม่สมบูรณ์

สิ่งหนึ่งที่อาจทำให้เกิดการโหลดแบบขี้เกียจเกิดขึ้นเมื่อวนซ้ำผลการค้นหาบางอย่าง

สิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยอนุญาตให้ MARS ในสตริงการเชื่อมต่อของคุณ เพิ่มMultipleActiveResultSets=trueไปยังส่วนผู้ให้บริการของสตริงการเชื่อมต่อของคุณ (ที่ระบุแหล่งข้อมูลแคตตาล็อกเริ่มต้น ฯลฯ )


34
สิ่งนี้ใช้ได้สำหรับฉัน หากคุณต้องการอ่านเพิ่มเติมเกี่ยวกับการเปิดใช้งานหลายชุดผลการใช้งาน (MARS) ดูmsdn.microsoft.com/en-us/library/h32h3abf(v=vs.100).aspx ลองอ่านข้อเสียของ MARS เช่นกันstackoverflow.com/questions/374444/…
Diganta Kumar

3
การคำนึงถึงประสิทธิภาพคุณสามารถแก้ไขปัญหานี้ได้ด้วยการรวม System.Data.Entity แล้วใช้คำสั่งรวมเพื่อให้แน่ใจว่าข้อมูลรองนี้ถูกโหลดในคิวรีดั้งเดิม หากคุณเปิดใช้งาน MARS การปิดเพื่อตรวจสอบการโหลดข้อมูลซ้ำ ๆ เหล่านี้สามารถช่วยเพิ่มความเร็วในการประมวลผลการโทรของคุณโดยลดการเดินทางไปกลับ
Chris Moschini

70
การเปิดใช้งาน MARS ควรทำสำหรับชุดย่อยของปัญหา / การใช้เคสน้อยมาก ในกรณีส่วนใหญ่ข้อผิดพลาดที่เป็นปัญหาเกิดจากรหัส BAD ภายในแอปพลิเคชันการโทร รายละเอียดเพิ่มเติมได้ที่นี่: devproconnections.com/development/ ......
Michael K. Campbell

132
การเพิ่ม. ToList () หลังจาก your.Include () โดยที่ () น่าจะแก้ปัญหาได้
Serj Sagan

2
หากต้องการทำให้การเชื่อมต่อ SQL ทั่วโลกเปลี่ยนไปอย่างกว้าง ๆ สำหรับการสืบค้นหนึ่งครั้งนั้นไร้สาระ คำตอบที่ถูกต้องควรเป็น ToList อย่างใดอย่างหนึ่งด้านล่าง การแก้ไขท้องถิ่น (เช่นเพียงเปลี่ยนแบบสอบถาม) สำหรับปัญหาที่มีการแปล!
bytedev

218

คุณสามารถใช้ToList()วิธีก่อนreturnคำสั่ง

var accounts =
from account in context.Accounts
from guranteer in account.Gurantors

 select new AccountsReport
{
    CreditRegistryId = account.CreditRegistryId,
    AccountNumber = account.AccountNo,
    DateOpened = account.DateOpened,
};

 return accounts.AsEnumerable()
               .Select((account, index) => new AccountsReport()
                       {
                           RecordNumber = FormattedRowNumber(account, index + 1),
                           CreditRegistryId = account.CreditRegistryId,
                              DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),
                           AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)}).OrderBy(c=>c.FormattedRecordNumber).ThenByDescending(c => c.StateChangeDate).ToList();


 public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
    {
        var dateReported = (from h in context.AccountHistory
                            where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
                            select h.LastUpdated).Max();
        return dateReported;
    }

9
ฉันมีข้อผิดพลาดนี้หลายครั้งแล้ว ... และทุกครั้งที่ฉันลืม! คำตอบของคำถามนั้นคือใช้ ToList () เสมอ
Cheesus Toast

1
มีข้อเสียใด ๆ ในเรื่องนี้หรือไม่? หากคุณมี 100k แถวฉันสงสัยว่านี่จะดี
Martin Dawson

2
@MartinMazzaDawson คุณต้องการบันทึก 100K พร้อมกันในการดำเนินการค้นหาครั้งเดียว ?? ฉันคิดว่าการใช้การให้เลขหน้าเป็นความคิดที่ดีสำหรับสถานการณ์นี้
kazem

ขออภัยที่จะเพิ่มหัวข้อเก่า แต่ฉันเข้ามาในข้อผิดพลาดเดียวกันในขณะที่การพัฒนา RepositoryPattern และฉันแก้ไขได้โดยการเพิ่ม ".ToList () หรือ Single () หรือนับ ()" ทุกวิธีของพื้นที่เก็บข้อมูล ในขณะที่เริ่มต้นฉันเพิ่งกลับมา ".AsEnumerable ()" ตอนนี้คำถามของฉันคือ: ที่เก็บควรส่งคืน "ToList ()" หรือนี่คือสิ่งที่ผู้ซื้อขั้นสุดท้ายต้องการ (เช่น: ตรรกะการบริการ / ธุรกิจ)
alessalessio

ได้ผลสำหรับฉัน การเพิ่ม. ToList จะแก้ปัญหาการสนับสนุนทศนิยมใน JetEntityFrameworkProvider Total = storeDb.OF_Carts.Where(x => x.CartId == ShoppingCartId).ToList().Sum(t => t.Quantity * t.Item.UnitPrice);
hubert17

39

ใช้ไวยากรณ์.ToList()เพื่อแปลงออบเจ็กต์ที่อ่านจากฐานข้อมูลเป็นรายการเพื่อหลีกเลี่ยงการอ่านซ้ำอีกครั้งหวังว่าสิ่งนี้จะได้ผล ขอบคุณ


22

นี่คือสตริงการเชื่อมต่อที่ใช้งานได้สำหรับผู้ที่ต้องการการอ้างอิง

  <connectionStrings>
    <add name="IdentityConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\IdentityDb.mdf;Integrated Security=True;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />
  </connectionStrings>

15
การเปิดใช้งาน MARS เป็นการแก้ปัญหาไม่ใช่วิธีแก้ปัญหา
SandRock

5
จากหน้าเอกสารประกอบของ MARS: "การดำเนินการ MARS ไม่ปลอดภัยสำหรับเธรด" ซึ่งหมายความว่าหากปัญหาเกิดขึ้นจากหลายเธรดที่เข้าถึงบริบท MARS ไม่ใช่วิธีแก้ปัญหา
marsop

20

ในกรณีของฉันการใช้Include()แก้ไขข้อผิดพลาดนี้และขึ้นอยู่กับสถานการณ์อาจมีประสิทธิภาพมากขึ้นแล้วออกแบบสอบถามหลายรายการเมื่อสามารถสอบถามทั้งหมดพร้อมกันด้วยการเข้าร่วม

IEnumerable<User> users = db.Users.Include("Projects.Tasks.Messages");

foreach (User user in users)
{
    Console.WriteLine(user.Name);
    foreach (Project project in user.Projects)
    {
        Console.WriteLine("\t"+project.Name);
        foreach (Task task in project.Tasks)
        {
            Console.WriteLine("\t\t" + task.Subject);
            foreach (Message message in task.Messages)
            {
                Console.WriteLine("\t\t\t" + message.Text);
            }
        }
    }
}

นี่เป็นทางออกที่ดีที่สุดหากใบสมัครของคุณไม่ต้องการ MARS
Fred Wilson

7

ฉันไม่ทราบว่านี่เป็นคำตอบที่ซ้ำกันหรือไม่ ถ้าฉันขอโทษ ฉันแค่ต้องการให้คนขัดสนรู้วิธีแก้ไขปัญหาของฉันด้วย ToList ()

ในกรณีของฉันฉันได้รับข้อยกเว้นเดียวกันสำหรับแบบสอบถามด้านล่าง

int id = adjustmentContext.InformationRequestOrderLinks.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).Max(item => item.Id);

ฉันแก้ไขเหมือนด้านล่าง

List<Entities.InformationRequestOrderLink> links = adjustmentContext.InformationRequestOrderLinks
.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).ToList();

int id = 0;

if (links.Any())
{
  id = links.Max(x => x.Id);
 }
if (id == 0)
{
//do something here
}

5

ดูเหมือนว่าคุณกำลังเรียก DateLastUpdated จากภายในคิวรีที่แอ็คทีฟโดยใช้บริบท EF เดียวกันและ DateLastUpdate ออกคำสั่งไปยังแหล่งข้อมูลเอง Entity Framework รองรับคำสั่งที่ใช้งานเพียงหนึ่งคำสั่งต่อบริบทในแต่ละครั้ง

คุณสามารถ refactor แบบสอบถามสองข้อด้านบนของคุณเป็นแบบนี้:

return accounts.AsEnumerable()
        .Select((account, index) => new AccountsReport()
        {
          RecordNumber = FormattedRowNumber(account, index + 1),
          CreditRegistryId = account.CreditRegistryId,
          DateLastUpdated = (
                                                from h in context.AccountHistory 
                                                where h.CreditorRegistryId == creditorRegistryId 
                              && h.AccountNo == accountNo 
                                                select h.LastUpdated).Max(),
          AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)
        })
        .OrderBy(c=>c.FormattedRecordNumber)
        .ThenByDescending(c => c.StateChangeDate);

ฉันยังสังเกตเห็นว่าคุณกำลังเรียกใช้ฟังก์ชันเช่น FormattedAccountNumber และ FormattedRecordNumber ในแบบสอบถาม นอกจากว่าเป็น procs หรือฟังก์ชั่นที่เก็บไว้ที่คุณนำเข้าจากฐานข้อมูลของคุณไปยังโมเดลข้อมูลเอนทิตีและการแมปที่ถูกต้องสิ่งเหล่านี้จะถูกโยนยกเว้นว่า EF จะไม่รู้วิธีการแปลฟังก์ชั่นเหล่านั้น

โปรดทราบว่าการเรียก AsEnumerable ไม่ได้บังคับให้แบบสอบถามดำเนินการ จนกว่าการดำเนินการแบบสอบถามจะถูกเลื่อนออกไปจนกว่าจะแจกแจง คุณสามารถบังคับให้แจงนับด้วย ToList หรือ ToArray หากคุณต้องการ


หากคุณต้องการคุณสามารถ refactor แบบสอบถามที่คุณกำลังทำเพื่อรับ DateLastUpdated directy ลงในโปรเจคที่คุณเลือกสำหรับแบบสอบถามรายงานบัญชีและรับผลที่ต้องการโดยไม่มีข้อผิดพลาด
James Alexander

ฉันได้รับข้อผิดพลาดเดียวกันหลังจากใส่รหัสของฟังก์ชั่นในการสืบค้นหลัก
DotnetSparrow

2

นอกจากคำตอบของ Ladislav Mrnka :

หากคุณกำลังเผยแพร่และลบล้างคอนเทนเนอร์บนแท็บการตั้งค่าคุณสามารถตั้งค่า MultipleActiveResultSetเป็น True คุณสามารถค้นหาตัวเลือกนี้ได้โดยคลิกขั้นสูง ...และจะอยู่ภายใต้กลุ่มขั้นสูง


2

สำหรับผู้ที่ค้นพบสิ่งนี้ผ่านทาง Google;
ฉันได้รับข้อผิดพลาดนี้เนื่องจากตามข้อผิดพลาดฉันไม่สามารถปิด SqlDataReader ก่อนที่จะสร้างรายการอื่นใน SqlCommand เดียวกันโดยไม่ได้ตั้งใจสมมติว่ามันจะถูกเก็บขยะเมื่อออกจากวิธีที่สร้างขึ้น

ฉันแก้ไขปัญหาด้วยการโทรsqlDataReader.Close();ก่อนที่จะสร้างผู้อ่านคนที่สอง


2

ในกรณีของฉันฉันได้เปิดแบบสอบถามจากบริบทข้อมูลเช่น

    Dim stores = DataContext.Stores _
        .Where(Function(d) filter.Contains(d.code)) _

... จากนั้นจึงสอบถามกัน ...

    Dim stores = DataContext.Stores _
        .Where(Function(d) filter.Contains(d.code)).ToList

การเพิ่มตัว.ToListแรกแก้ไขปัญหาของฉัน ฉันคิดว่ามันสมเหตุสมผลที่จะห่อสิ่งนี้ไว้ในอสังหาริมทรัพย์เช่น:

Public ReadOnly Property Stores As List(Of Store)
    Get
        If _stores Is Nothing Then
            _stores = DataContext.Stores _
                .Where(Function(d) Filters.Contains(d.code)).ToList
        End If
        Return _stores
    End Get
End Property

โดยที่ _stores เป็นตัวแปรส่วนตัวและตัวกรองยังเป็นคุณสมบัติแบบอ่านอย่างเดียวที่อ่านจาก AppSettings


1

ฉันมีข้อผิดพลาดเดียวกันเมื่อฉันพยายามปรับปรุงบางระเบียนภายในลูปการอ่าน ฉันได้ลองคำตอบที่ได้รับการโหวตมากที่สุดMultipleActiveResultSets=trueและพบว่ามันเป็นเพียงวิธีแก้ปัญหาเพื่อรับข้อผิดพลาดต่อไป 

ไม่อนุญาตการทำธุรกรรมใหม่เนื่องจากมีเธรดอื่นทำงานอยู่ในเซสชัน

วิธีที่ดีที่สุดที่ใช้งานได้กับ ResultSets ขนาดใหญ่คือการใช้ chunks และเปิดบริบทที่แยกต่างหากสำหรับแต่ละ chunk ตามที่อธิบายไว้ใน  SqlException จาก Entity Framework - ไม่อนุญาตการทำธุรกรรมใหม่เนื่องจากมีเธรดอื่นทำงานอยู่ในเซสชัน


1

ฉันแก้ไขปัญหานี้ได้โดยเปลี่ยนคอย _accountSessionDataModel.SaveChangesAsync (); ถึง _accountSessionDataModel.SaveChanges (); ในคลาส Repository ของฉัน

 public async Task<Session> CreateSession()
    {
        var session = new Session();

        _accountSessionDataModel.Sessions.Add(session);
        await _accountSessionDataModel.SaveChangesAsync();
     }

เปลี่ยนเป็น:

 public Session CreateSession()
    {
        var session = new Session();

        _accountSessionDataModel.Sessions.Add(session);
        _accountSessionDataModel.SaveChanges();
     }

ปัญหาคือฉันอัปเดตเซสชันในส่วนหน้าหลังจากสร้างเซสชัน (ในรหัส) แต่เนื่องจาก SaveChangesAsync เกิดขึ้นแบบอะซิงโครนัสการดึงข้อมูลเซสชันทำให้เกิดข้อผิดพลาดนี้เพราะเห็นได้ชัดว่าการดำเนินการ SaveChangesAsync ยังไม่พร้อม


1

สำหรับฉันมันเป็นข้อผิดพลาดของฉันเอง ผมพยายามที่จะเรียกใช้INSERTโดยใช้เมื่อฉันควรจะได้รับใช้SqlCommand.executeReader() SqlCommand.ExecuteNonQuery()มันถูกเปิดและไม่เคยปิดทำให้เกิดข้อผิดพลาด ระวังการกำกับดูแลนี้


มันเป็นปัญหาเดียวกันจากด้านข้างของฉัน ฉันต้องการ SqlCommand.executeReader () เพราะฉันได้รับการแทรกแถว ID ดังนั้น: ฉันใช้ SqlDataReader.Close (); คำสั่ง SQL. ทิ้ง (); ขอบคุณ @Andrew Taylor
Fuat

1

นี่คือการสกัดจากสถานการณ์โลกแห่งความจริง:

  • รหัสทำงานได้ดีในสภาพแวดล้อมที่มีการตั้งค่า MultipleActiveResultSets ในสตริงการเชื่อมต่อ
  • รหัสที่เผยแพร่ไปยังสภาพแวดล้อมการผลิตที่ไม่มี MultipleActiveResultSets = true
  • หน้า / การโทรจำนวนมากทำงานในขณะที่หน้าเดียวล้มเหลว
  • มองใกล้ที่โทรมีการโทรที่ไม่จำเป็นไปยังฐานข้อมูลและจำเป็นต้องลบออก
  • ตั้งค่า MultipleActiveResultSets = true ในการผลิตและเผยแพร่โค้ดที่ล้างแล้วทุกอย่างทำงานได้ดีและมีประสิทธิภาพ

สรุปโดยไม่ลืมเกี่ยวกับ MultipleActiveResultSets รหัสอาจจะมีการทำงานเป็นเวลานานก่อนที่จะพบการเรียกฐานข้อมูลซ้ำซ้อนที่อาจจะมีค่าใช้จ่ายสูงมากและผมขอแนะนำให้ไม่ได้อย่างเต็มที่ขึ้นอยู่กับการตั้งค่า MultipleActiveResultSets แอตทริบิวต์ แต่ยังหาว่าทำไมรหัสต้องการมัน ที่มันล้มเหลวที่มันล้มเหลว


1

เป็นไปได้มากว่าปัญหานี้เกิดขึ้นเนื่องจากคุณสมบัติ "lazy loading" ของ Entity Framework โดยปกติเว้นแต่จะมีการร้องขออย่างชัดเจนในระหว่างการดึงข้อมูลเริ่มต้นข้อมูลที่เข้าร่วมทั้งหมด (สิ่งใดก็ตามที่เก็บไว้ในตารางฐานข้อมูลอื่น) จะถูกดึงข้อมูลเมื่อจำเป็นเท่านั้น ในหลายกรณีที่เป็นสิ่งที่ดีเนื่องจากจะช่วยป้องกันการดึงข้อมูลที่ไม่จำเป็นและช่วยปรับปรุงประสิทธิภาพการสืบค้น (ไม่มีการรวม) และประหยัดแบนด์วิดท์

ในสถานการณ์ที่อธิบายในคำถามจะมีการดึงข้อมูลเริ่มต้นและในระหว่างที่มีการร้องขอขั้นตอน "เลือก" ที่ไม่มีข้อมูลการโหลดขี้เกียจจะมีการออกแบบสอบถามเพิ่มเติมและจากนั้น EF ก็บ่นเกี่ยวกับ "open DataReader"

วิธีแก้ปัญหาที่เสนอในคำตอบที่ยอมรับจะช่วยให้สามารถดำเนินการค้นหาเหล่านี้ได้และคำขอทั้งหมดจะสำเร็จ

อย่างไรก็ตามหากคุณจะตรวจสอบคำขอที่ส่งไปยังฐานข้อมูลคุณจะสังเกตเห็นคำขอหลายคำขอ - คำขอเพิ่มเติมสำหรับข้อมูลที่หายไป (ขี้เกียจ) แต่ละรายการหายไป นี่อาจเป็นนักฆ่าประสิทธิภาพ

วิธีที่ดีกว่าคือบอกให้ EF โหลดข้อมูลที่โหลดแบบขี้เกียจที่จำเป็นทั้งหมดล่วงหน้าในระหว่างการสืบค้นครั้งแรก สิ่งนี้สามารถทำได้โดยใช้คำสั่ง "รวม":

using System.Data.Entity;

query = query.Include(a => a.LazyLoadedProperty);

ด้วยวิธีนี้การรวมที่จำเป็นทั้งหมดจะถูกดำเนินการและข้อมูลที่จำเป็นทั้งหมดจะถูกส่งกลับเป็นแบบสอบถามเดียว ปัญหาที่อธิบายในคำถามจะได้รับการแก้ไข


นี่เป็นคำตอบที่ถูกต้องเพราะฉันไปจากการใช้รวมถึงการใช้ EntityEntry.Collection (). Load () และวิธีการแก้ปัญหาของฉันเริ่มทำงานจนพัง น่าเสียดายที่การรวมทั่วไปไม่สามารถ "ThenInclude" ทั่วไปอื่นดังนั้นฉันยังคงพยายามทำให้ EntityEntry.Collection () โหลด () ทำงานได้
AndrewBenjamin

0

ฉันใช้บริการเว็บในเครื่องมือของฉันซึ่งบริการเหล่านั้นดึงข้อมูลกระบวนการที่เก็บไว้ ในขณะที่เครื่องมือไคลเอนต์จำนวนมากดึงบริการเว็บออกมาปัญหานี้ก็เกิดขึ้น ฉันได้แก้ไขแล้วโดยการระบุแอตทริบิวต์การซิงโครไนซ์สำหรับฟังก์ชันเหล่านั้นจะดึงขั้นตอนที่เก็บไว้ ตอนนี้มันทำงานได้ดีข้อผิดพลาดไม่เคยปรากฏในเครื่องมือของฉัน

 [MethodImpl(MethodImplOptions.Synchronized)]
 public static List<t> MyDBFunction(string parameter1)
  {
  }

คุณลักษณะนี้ช่วยให้การประมวลผลคำขอครั้งละหนึ่ง ดังนั้นสิ่งนี้จึงแก้ปัญหาได้


0

เป็นหมายเหตุด้าน ... สิ่งนี้สามารถเกิดขึ้นได้เมื่อมีปัญหาเกี่ยวกับการแมปข้อมูลภายใน (ภายใน) จากวัตถุ SQL

เช่น ...

ฉันสร้างSQL Scalar Functionที่ตั้งใจกลับVARCHAR... และแล้ว ... VIEWใช้มันเพื่อสร้างคอลัมน์ในที่ VIEWถูกแมปอย่างถูกต้องในDbContext... ดังนั้นLinqถูกเรียกมันว่าเพียงแค่ปรับ อย่างไรก็ตามEntityคาดว่าจะDateTime? และVIEWกำลังจะกลับสตริง

ข้อผิดพลาดใดที่ ...

"มี DataReader เปิดที่เชื่อมโยงกับคำสั่งนี้อยู่แล้วซึ่งจะต้องปิดก่อน"

มันยากที่จะคิดออก ... แต่หลังจากฉันแก้ไขพารามิเตอร์ส่งคืน ... ทุกอย่างเป็นไปด้วยดี


0

ในกรณีของฉันฉันมีการตั้งค่าMultipleActiveResultSetsไปTrueในสตริงการเชื่อมต่อ
จากนั้นจะปรากฏข้อผิดพลาดอื่น (ของจริง) เกี่ยวกับการไม่สามารถเรียกใช้คำสั่ง 2 (SQL) ในเวลาเดียวกันในบริบทข้อมูลเดียวกัน! (EF Core, Code ก่อน)
ดังนั้นทางออกสำหรับฉันคือการมองหาการดำเนินการคำสั่งแบบอะซิงโครนัสอื่น ๆและทำให้มันเป็นแบบซิงโครนัสสเนื่องจากฉันมี DbContext เพียงคำเดียวสำหรับทั้งสองคำสั่ง

ฉันหวังว่ามันจะช่วยคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.