Nur Quellen, die Umsetzung IAsyncEnumerable kann verwendet werden, für die Entity Framework asynchrone Operationen
Ich bin der Implementierung eines Modells mit EF 6.1.3 und .NET Framework 4.6.1.
Dieses Modell wird durch eine ASPNET app und durch ein ASPNET-KERN-app, aus diesem Grund es System.Daten.Wesen und es befindet sich in einer separaten assembly mymodel.dll.
Dies ist das Modell
using System.Data.Entity;
public partial class MyDbContext : DbContext
{
public virtual DbSet<Athlete> Athletes{ get; set; }
}
public partial class Athlete
{
public Athlete()
{
}
//...
public string Country { get; set; }
}
Entwickle ich die MVC-Anwendung, umgesetzt in aspnet-core mit .NET Framework 4.6. Es verweist EF 6.1.3, so dass das Modell verwendet werden kann.
public class MyViewModel
{
public IList<Athlete> ItalianAthletes{ get; set; }
}
using Microsoft.EntityFrameworkCore;
//solution: comment the previous line and use instead System.Data.Entity;
public class MyController : Controller
{
private readonly MyDbContext _context;
//...
public IActionResult Index()
{
MyViewModel myvm = new MyViewModel();
var result = _context.Athletes.Where(a=>a.Country=="Italy").ToList();
myvm.ItalianAthletes = result ;
return View(myvm);
}
}
... und es funktioniert wie erwartet.
Nun ändern des Index-Methode async
public async Task<IActionResult> Index()
{
MyViewModel myvm = new MyViewModel();
var result = _context.Athletes.Where(a=>a.Country=="Italy").ToListAsync();
await result; //at this point an exception is thrown
//...
}
InvalidOperationException: Die Quelle IQueryable nicht umsetzen IAsyncEnumerable. Nur Quellen, die Umsetzung IAsyncEnumerable kann verwendet werden, für die Entity Framework asynchrone Operationen.
Entfernen der Where () - Klausel das problem weiterhin besteht, also das problem scheint im Zusammenhang mit ToListAsync();
var result = _context.Users.ToListAsync();
Sorgfältig Lesen Sie den text der Ausnahme, die ich verstehen, dass "die IQueryable generiert ToList() nicht implementieren IAsyncEnumerable" aber das tut nicht machen Sinn für mich, weil alle, die das Verhalten der interne ToListAsync();
Kann mir jemand helfen, besser zu verstehen, was hier passiert unter der Haube? und was kann ich tun, damit ToListAsync() funktioniert wie erwartet ?
vielen Dank im Voraus für jeden Kommentar
- kann geholfen werden, Sie : msdn.microsoft.com/en-us/data/dn313107
- bearbeitet den code mit der Lösung
- Für Entity Framework-Kern besuchen Sie diesen link
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wollen Sie eines dieser 2 Dinge.
Referenz des EF nuget-Pakets in beide Assemblys. Dies ist, weil diese
ToListAsync()
Betrieb tatsächlich aufgerufen wird, über die auf Ihre EF DbContext-und dies nicht geschehen kann, aus einem Projekt, das keinen Bezug hat zu EF NugetPackage. Wenn dies bereits der Fall, stellen Sie sicher, dass Sie verweisen auf die namespaceSystem.Data.Entity
in der using-Anweisungen am Anfang des Codes:da dies die Lage der Erweiterung Methode
ToListAsync
Sie anrufen möchten.Wickeln Sie den code zum abrufen von EF in einen Dienst in Ihrem Projekt verwenden, in EF, den Aufruf asynchron, und rufen Sie die von Ihrem asp.net mvc-Projekt. Dies wäre meine bevorzugte Wahl, da es fügt eine schöne Schicht der Abstraktion und macht den code einfacher zu testen/pflegen.
Code-Beispiel für 2. option
Hinweise:
using System.Data.Entity;
ist im Controller-code-Datei an der Spitze? Dieser namespace enthält die Erweiterung die Methode, die Sie anrufen möchten.Wenn du mit Entity-Framework-Core, dann müssen Sie diesen namespace verwenden:
statt