Am această interogare și primesc eroarea în această funcție:
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();
}
Eroarea este:
Nu este deja deschis un DataReader asociate cu această Comandă care trebuie să fie închisă.
Actualizare:
stack trace, a adăugat:
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
Acest lucru se poate întâmpla dacă executați o interogare în timp ce iterarea peste rezultatele din altă interogare. Nu este clar din exemplul dumneavoastră în cazul în care acest lucru se întâmplă pentru că exemplul nu este completă.
Singurul lucru pe care pot provoca acest lucru este leneș încărcare a declanșat atunci când iterarea peste unele rezultate din interogare.
Acest lucru poate fi ușor rezolvate de către permițându-MARTE în șirul de conexiune. Adauga MultipleActiveResultSets=true
la furnizor parte din șirul de conexiune (în cazul în care Sursa de Date, Initial Catalog, etc. sunt specificate).
Puteți utiliza ToList()
metoda înainte "returnare" declarație.
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;
}
utilizați sintaxa .ToList()
pentru a converti obiectul citit de la db la lista pentru a evita să fie re-citit din nou.Sper că acest lucru va lucra pentru ea. Multumesc.
Aici este un lucru șir de conexiune pentru cineva care are nevoie de referință.
<connectionStrings>
<add name="IdentityConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\IdentityDb.mdf;Integrated Security=True;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />
</connectionStrings>
În cazul meu, folosind Includ()
a rezolvat această eroare și în funcție de situația poate fi mult mai eficient atunci emite mai multe interogări atunci când acesta poate fi interogat la o dată cu un se alăture.
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);
}
}
}
}
Eu nu știu dacă acest lucru este duplicat răspunde sau nu. Daca este imi pare rau. Vreau doar să nevoiași stiu cum am rezolvat problema mea cu ajutorul ToList().
În cazul meu, am primit aceeași excepție pentru interogare de mai jos.
int id = adjustmentContext.InformationRequestOrderLinks.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).Max(item => item.Id);
Am rezolvat ca mai jos
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
}
Se pare că te're de asteptare DateLastUpdated dintr-o interogare activă, folosind același EF context și DateLastUpdate probleme legate de o comanda la magazin de date în sine. Entity Framework acceptă doar o singură comandă activă pe context la un moment dat.
Puteți refactor ta de mai sus două interogări într-o astfel de prognoze:
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);
De asemenea, am observat că're de asteptare funcții, cum ar fi FormattedAccountNumber și FormattedRecordNumber în interogări. Excepția cazului în care acestea sunt stocate procs sau funcții'am importate din baza de date în modelul de date entitate și mapate corect, acestea vor arunca în afară ca EF nu știu cum să traduc aceste funcții în declarații se poate trimite la depozitul de date.
Rețineți, de asemenea, de asteptare AsEnumerable nu't forța de interogare pentru a executa. Până la executarea interogării este amânată până enumerate. Puteți forța enumerare cu ToList sau ToArray dacă doresc acest lucru.
În plus față de Ladislav Mrnka's răspuns:
Dacă sunteți de publicare și imperative container pe Setări tab, puteți seta MultipleActiveResultSet la True. Puteți găsi această opțiune, făcând clic Avansat... si's de gând să fie sub Avansat de grup.
În cazul meu, am deschis o interogare de date context, ca
Dim stores = DataContext.Stores _
.Where(Function(d) filter.Contains(d.code)) _
și apoi a întrebat același lucru...
Dim stores = DataContext.Stores _
.Where(Function(d) filter.Contains(d.code)).ToList
Adăugarea `.ToList la prima rezolvat problema mea. Cred că e logic să terminăm într-o proprietate, cum ar fi:
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
În cazul în care _stores este o variabilă privat, și Filtre este, de asemenea, un readonly proprietate care citește de la AppSettings.
Cel mai probabil, această problemă se întâmplă din cauza "încărcare lazy" caracteristică de Entity Framework. De obicei, cu excepția cazului în mod explicit necesare în timpul inițiale aduce, toate s-au alăturat de date (orice stocate în alte tabele de baze de date) este preluat numai atunci când este necesar. În multe cazuri, acesta este un lucru bun, deoarece acesta previne de la preluarea datelor inutile și, astfel, a îmbunătăți performanța de interogare (fara imbinari) și economisește lățimea de bandă.
În situația descrisă în întrebare, initial fetch este efectuată, și în timpul "selectați" faza de lipsă de încărcare leneș sunt solicitate date, interogări suplimentare sunt emise și apoi EF se plang de "open DataReader".
Soluție propusă în răspunsul acceptat va permite executarea acestor interogări, și într-adevăr, întreaga cerere va reuși.
Cu toate acestea, dacă va examina cererile trimise la baza de date, veți observa mai multe cereri - cerere suplimentară pentru fiecare lipsă (leneș încărcat) de date. Acest lucru ar putea fi un spectacol criminal.
O mai bună abordare este de a spune la EF să preload toate necesare leneș date încărcate în timpul interogarea inițială. Acest lucru poate fi realizat folosind "Include" declarație:
using System.Data.Entity;
query = query.Include(a => a.LazyLoadedProperty);
În acest fel, toate necesare se alătură vor fi efectuate și toate datele necesare vor fi returnate ca o singură interogare. Problema descrisă în întrebare va fi rezolvată.
Am rezolvat aceasta problema prin schimbarea așteaptă _accountSessionDataModel.SaveChangesAsync(); pentru a _accountSessionDataModel.SaveChanges(); în Repository-ul de clasă.
public async Task<Session> CreateSession()
{
var session = new Session();
_accountSessionDataModel.Sessions.Add(session);
await _accountSessionDataModel.SaveChangesAsync();
}
Schimbat la:
public Session CreateSession()
{
var session = new Session();
_accountSessionDataModel.Sessions.Add(session);
_accountSessionDataModel.SaveChanges();
}
Problema a fost că am actualizat Sesiuni în frontend după crearea unei sesiuni (în cod), dar pentru că SaveChangesAsync se întâmplă în mod asincron, preluarea sesiunile cauzat acest lucru de eroare pentru că se pare că SaveChangesAsync operațiunea nu a fost încă gata.
Pentru cei găsirea acest lucru prin intermediul Google; Am fost obtinerea această eroare, deoarece, după cum a sugerat de eroare, nu am reușit să închid un SqlDataReader înainte de a crea o alta în aceeași SqlCommand, din greșeală presupunând că ar fi gunoi colectate atunci când părăsesc metoda a fost creat în.
Am rezolvat problema prin apelarea sqlDataReader.Close();
înainte de a crea cel de-al doilea cititor.
Am avut aceeasi eroare, atunci când am încercat să actualizeze înregistrările în termen de citit buclă. Am'am încercat cel mai votat răspuns MultipleActiveResultSets=true` și a constatat, că-l's doar soluție pentru a obține următoarea eroare
Noua tranzacție nu este permis, deoarece acolo sunt alte fire care rulează în sesiune
Cea mai bună abordare, care va lucra pentru mare ResultSets este de a folosi bucăți și deschide context separată pentru fiecare bucată așa cum este descris în https://stackoverflow.com/questions/2113498/sqlexception-from-entity-framework-new-transaction-is-not-allowed-because-ther/37762186#37762186
În cazul meu, a trebuit să setați `MultipleActiveResultSets să "Adevărat" în șirul de conexiune. Apoi a apărut un alt eroare (cea reală) despre a nu fi capabil de a rula 2 (SQL) comenzi în același timp, pe aceleași date de context! (EF Core, primul Cod) Deci solutia pentru mine a fost să se uite pentru orice alte asincron executarea de comenzi și de a le transforma la sincron, ca am avut doar una DbContext pentru ambele comenzi.
Sper că vă ajută
Ei bine pentru mine a fost propriul meu bug. Am fost încercarea de a rula o INSERT
ajutorul SqlCommand.executeReader ()
, când ar fi trebuit folosind SqlCommand.ExecuteNonQuery()
. Acesta a fost deschis și nu închis, provoacă eroarea. Ferește-te de această supraveghere.
Acest lucru este extras dintr-un scenariu de lumea reală:
În concluzie, fără a uita despre MultipleActiveResultSets, codul ar putea candida pentru o lungă perioadă de timp înainte de a descoperi un redundante db apel care ar putea fi foarte costisitoare, și vă sugerez să nu pe deplin depinde de setarea MultipleActiveResultSets atribut, dar, de asemenea, afla ce cod are nevoie de ea în cazul în care acesta nu a reușit.
Ca o paranteză...acest lucru se poate întâmpla, de asemenea, atunci când există o problemă cu (interne) de date-mapping din SQL Obiecte.
De exemplu...
Am creat un SQL Funcție Scalară
că accidental returnat un VARCHAR
...si apoi...a folosit-o pentru a genera o coloană într-o "VEDERE". La "VEDERE" a fost mapat corect în DbContext
...asa ca Linq suna foarte bine. Cu toate acestea, Entitate temperatura DateTime? și de "VEDERE" a fost revenirea String.
Ce CIUDAT aruncă...
"Nu este deja deschis un DataReader asociate cu aceasta Comanda care trebuie să fie închise în primul rând"
A fost greu să-mi dau seama...dar dupa ce am corectat reveni parametri...totul a fost bine
Eu sunt, folosind servicii web în instrument, în cazul în care aceste servicii aduc procedură stocată. în timp ce mai mult numărul de instrument de client preia serviciul web, această problemă apare. Am fixat prin specificarea Sincronizate atribut pentru cei funcția preia procedura stocată. acum este de lucru bine, eroarea nu a mai apărut în instrument.
[MethodImpl(MethodImplOptions.Synchronized)]
public static List<t> MyDBFunction(string parameter1)
{
}
Acest atribut permite pentru a procesa o cerere la un moment dat. deci, acest lucru rezolvă Problema.