Saya memiliki permintaan ini dan saya mendapatkan kesalahan dalam fungsi ini:
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();
}
Kesalahan adalah:
Sudah ada DataReader terbuka yang terkait dengan Perintah ini yang harus ditutup terlebih dahulu.
Memperbarui:
tumpukan jejak ditambahkan:
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
c#
entity-framework
entity-framework-4
DotnetSparrow
sumber
sumber
Anda dapat menggunakan
ToList()
metode ini sebelumreturn
pernyataan.sumber
Total = storeDb.OF_Carts.Where(x => x.CartId == ShoppingCartId).ToList().Sum(t => t.Quantity * t.Item.UnitPrice);
gunakan sintaks
.ToList()
untuk mengonversi objek yang dibaca dari db ke daftar untuk menghindari dibaca ulang lagi. Semoga ini bisa berhasil. Terima kasih.sumber
Berikut adalah string koneksi yang berfungsi untuk seseorang yang membutuhkan referensi.
sumber
Dalam kasus saya, menggunakan
Include()
menyelesaikan kesalahan ini dan bergantung pada situasinya dapat menjadi jauh lebih efisien daripada mengeluarkan beberapa kueri ketika semuanya dapat ditanyakan sekaligus dengan bergabung.sumber
Saya tidak tahu apakah ini jawaban ganda atau tidak. Jika itu saya minta maaf. Saya hanya ingin memberi tahu orang yang membutuhkan bagaimana saya memecahkan masalah saya menggunakan ToList ().
Dalam kasus saya, saya mendapat pengecualian yang sama untuk kueri di bawah ini.
Saya memecahkan seperti di bawah ini
sumber
Tampaknya Anda memanggil DateLastUpdated dari dalam kueri aktif menggunakan konteks EF yang sama dan DateLastUpdate mengeluarkan perintah ke penyimpanan data itu sendiri. Entity Framework hanya mendukung satu perintah aktif per konteks pada suatu waktu.
Anda dapat mengubah dua kueri di atas menjadi satu seperti ini:
Saya juga memperhatikan Anda memanggil fungsi seperti FormattedAccountNumber dan FormattedRecordNumber di kueri. Kecuali jika ini disimpan procs atau fungsi yang Anda impor dari basis data Anda ke dalam model data entitas dan dipetakan dengan benar, ini juga akan membuang pengecualian karena EF tidak akan tahu bagaimana menerjemahkan fungsi-fungsi itu ke dalam pernyataan yang dapat dikirim ke penyimpanan data.
Perhatikan juga, memanggil AsEnumerable tidak memaksa permintaan untuk mengeksekusi. Sampai eksekusi permintaan ditunda sampai disebutkan. Anda dapat memaksakan enumerasi dengan ToList atau ToArray jika diinginkan.
sumber
Selain jawaban Ladislav Mrnka :
Jika Anda menerbitkan dan mengganti wadah pada tab Pengaturan , Anda dapat mengatur MultipleActiveResultSet ke True. Anda dapat menemukan opsi ini dengan mengklik Advanced ... dan itu akan berada di bawah grup Advanced .
sumber
Bagi mereka yang menemukan ini melalui Google;
Saya mendapatkan kesalahan ini karena, seperti yang disarankan oleh kesalahan, saya gagal menutup SqlDataReader sebelum membuat yang lain di SqlCommand yang sama, keliru dengan menganggap bahwa itu akan menjadi sampah yang dikumpulkan ketika meninggalkan metode yang telah dibuat.
Saya memecahkan masalah dengan menelepon
sqlDataReader.Close();
sebelum membuat pembaca kedua.sumber
Dalam kasus saya, saya telah membuka kueri dari konteks data, seperti
... dan kemudian menanyakan hal yang sama ...
Menambahkan
.ToList
ke yang pertama menyelesaikan masalah saya. Saya pikir masuk akal untuk membungkus ini di properti seperti:Di mana _stores adalah variabel pribadi, dan Filter juga properti baca yang dibaca dari AppSettings.
sumber
Saya memiliki kesalahan yang sama, ketika saya mencoba memperbarui beberapa catatan dalam loop baca. Saya sudah mencoba jawaban yang paling banyak memilih
MultipleActiveResultSets=true
dan menemukan, bahwa itu hanya solusi untuk mendapatkan kesalahan berikutnyaPendekatan terbaik, yang akan bekerja untuk ResultSets yang sangat besar adalah dengan menggunakan potongan dan membuka konteks terpisah untuk setiap potongan seperti yang dijelaskan dalam SqlException dari Entity Framework - Transaksi baru tidak diperbolehkan karena ada utas lain yang berjalan di sesi
sumber
Saya memecahkan masalah ini dengan mengubah tunggu _accountSessionDataModel.SaveChangesAsync (); ke _accountSessionDataModel.SaveChanges (); di kelas Repositori saya.
Mengubahnya menjadi:
Masalahnya adalah saya memperbarui Sesi di frontend setelah membuat sesi (dalam kode), tetapi karena SaveChangesAsync terjadi secara tidak sinkron, mengambil sesi menyebabkan kesalahan ini karena tampaknya operasi SaveChangesAsync belum siap.
sumber
Bagi saya itu adalah bug saya sendiri. Saya mencoba menjalankan
INSERT
penggunaanSqlCommand.executeReader()
ketika saya seharusnya menggunakanSqlCommand.ExecuteNonQuery()
. Itu dibuka dan tidak pernah ditutup, menyebabkan kesalahan. Hati-hati dengan pengawasan ini.sumber
Ini diambil dari skenario dunia nyata:
Sebagai kesimpulan, tanpa melupakan MultipleActiveResultSets, kode tersebut mungkin telah berjalan lama sebelum menemukan panggilan db yang berlebihan yang bisa sangat mahal, dan saya menyarankan untuk tidak sepenuhnya bergantung pada pengaturan atribut MultipleActiveResultSets tetapi juga mencari tahu mengapa kode membutuhkannya. dimana gagal .
sumber
Kemungkinan besar masalah ini terjadi karena fitur "lazy loading" dari Entity Framework. Biasanya, kecuali diperlukan secara eksplisit selama pengambilan awal, semua data yang digabungkan (apa pun yang disimpan dalam tabel basis data lain) diambil hanya jika diperlukan. Dalam banyak kasus itu adalah hal yang baik, karena mencegah mengambil data yang tidak perlu dan dengan demikian meningkatkan kinerja kueri (tidak ada yang bergabung) dan menghemat bandwidth.
Dalam situasi yang diuraikan dalam pertanyaan, pengambilan awal dilakukan, dan selama fase "pilih" data pemuatan malas diminta, pertanyaan tambahan dikeluarkan dan kemudian EF mengeluh tentang "buka DataReader".
Solusi yang diajukan dalam jawaban yang diterima akan memungkinkan pelaksanaan pertanyaan ini, dan memang seluruh permintaan akan berhasil.
Namun, jika Anda akan memeriksa permintaan yang dikirim ke database, Anda akan melihat beberapa permintaan - permintaan tambahan untuk setiap data yang hilang (malas dimuat). Ini mungkin pembunuh kinerja.
Pendekatan yang lebih baik adalah memberi tahu EF untuk melakukan preload semua data malas yang diperlukan selama permintaan awal. Ini dapat dilakukan dengan menggunakan pernyataan "Sertakan":
Dengan cara ini, semua gabungan yang dibutuhkan akan dilakukan dan semua data yang dibutuhkan akan dikembalikan sebagai satu permintaan. Masalah yang dijelaskan dalam pertanyaan akan diselesaikan.
sumber
Saya menggunakan layanan web di alat saya, di mana layanan itu mengambil prosedur yang tersimpan. sementara lebih banyak alat klien mengambil layanan web, masalah ini muncul. Saya telah memperbaiki dengan menetapkan atribut Sinkronisasi untuk fungsi-fungsi itu mengambil prosedur yang tersimpan. sekarang berfungsi dengan baik, kesalahan tidak pernah muncul di alat saya.
Atribut ini memungkinkan untuk memproses satu permintaan pada suatu waktu. jadi ini memecahkan Masalah.
sumber
Sebagai catatan ... ini juga bisa terjadi ketika ada masalah dengan (internal) pemetaan data dari SQL Objects.
Contohnya...
Saya membuat
SQL Scalar Function
yang secara tidak sengaja mengembalikanVARCHAR
... dan kemudian ... menggunakannya untuk menghasilkan kolom di aVIEW
. ItuVIEW
dipetakan dengan benar diDbContext
... jadi Linq memanggilnya baik-baik saja. Namun, Entitas mengharapkan DateTime? dan StringVIEW
kembali .Yang Anehnya ...
Sulit untuk mengetahuinya ... tapi setelah saya koreksi kembali parameter ... semuanya baik-baik saja
sumber
Dalam kasus saya, saya harus mengatur
MultipleActiveResultSets
keTrue
dalam string koneksi.Kemudian muncul kesalahan lain (yang asli) tentang tidak dapat menjalankan 2 (SQL) perintah pada saat yang sama dalam konteks data yang sama! (EF Core, Code first)
Jadi solusi bagi saya adalah mencari eksekusi perintah asinkron lainnya dan mengubahnya menjadi sinkron , karena saya hanya punya satu DbContext untuk kedua perintah.
Saya harap ini membantu Anda
sumber