2016-11-21 4 views
3

Auf meinem Entity Framework Core-Projekt habe ich eine generische Repository mit einem GetAll() MethodeMissing DbSet.ToList

public ICollection<Entity> GetAll(){ 
    return DbSet.ToList(); 
} 

Aber wenn ich es ausführen, wirft die folgenden:

System.MissingMethodException was unhandled 
    HResult=-2146233069 
    Message=Method not found: 'Void Microsoft.EntityFrameworkCore.Query.QueryContextFactory..ctor(Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IStateManager, Microsoft.EntityFrameworkCore.Internal.IConcurrencyDetector, Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IChangeDetector)'. 
    Source=Microsoft.EntityFrameworkCore.Relational 
    StackTrace: 
     at Microsoft.EntityFrameworkCore.Query.Internal.RelationalQueryContextFactory..ctor(IStateManager stateManager, IConcurrencyDetector concurrencyDetector, IRelationalConnection connection, IChangeDetector changeDetector) 
    --- End of stack trace from previous location where exception was thrown --- 
     at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 
     at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) 
     at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServiceCollectionExtensions.<>c.<AddQuery>b__1_1(IServiceProvider p) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider) 
     at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) 
     at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor) 
     at Microsoft.EntityFrameworkCore.DbContext.get_QueryProvider() 
     at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.<.ctor>b__3_0() 
     at Microsoft.EntityFrameworkCore.Internal.LazyRef`1.get_Value() 
     at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator() 
     at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
     at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
     at DataAccessLayer.Repositories.BaseRepository`1.GetAll() in D:\TFS-LocalVersions\tourstop\Service\Musical.Broccoli.API\src\DataAccessLayer\Repositories\BaseRepository.cs:line 30 
     at Testing.Program.Main(String[] args) in D:\TFS-LocalVersions\tourstop\Service\Musical.Broccoli.API\Testing\Program.cs:line 40 
    InnerException 

Die DbContext ist inject und ich kann Register hinzufügen, kann aber keine ToList().

Mein DbContext ist

public class Context : DbContext 
{ 
    public Context(DbContextOptions<Context> options) : base(options) { } 
    public DbSet<Entity> Addresses { get; set; } 

Das Repository Konstruktor:

public BaseRepository(Context context) 
    { 
     this.Context = context; 
     this.DbSet = this.Context.Set<Entity>(); 
    } 

Und mit der Standard-DI wird

Die project.json injiziert ist folgende:

{ 
    "version": "1.0.0-*", 

    "dependencies": { 
    "MySql.Data.EntityFrameworkCore": "7.0.6-IR31", 
    "MySql.Data": "7.0.6-IR31", 
    "Common": "1.0.0-*", 
    "Microsoft.EntityFrameworkCore": "1.1.0", 
    "NETStandard.Library": "1.6.1" 
    }, 

    "frameworks": { 
    "netstandard1.6": { 
     "imports": "dnxcore50" 
    } 
    } 
} 

Hat jemand irgendwelche Ideen warum und wie löst man es?

+1

Sie sollten mehr Code aus dem Repository angezeigt - wir wissen nicht, was 'DbSet' ist! Ich nehme in meiner Antwort eine Menge davon an (vielleicht hätte ich nicht antworten sollen), aber hoffentlich immer noch hilfreich. – steamrolla

+1

Sorry, nur die Frage aktualisiert –

+0

Wie implementieren Sie das Basis-Repository? – steamrolla

Antwort

3

Versuchen "Microsoft.EntityFrameworkCore" zu entfernen: "1.1.0" von project.json

+0

Das wäre mir nie in den Sinn gekommen, aber es funktioniert. Wenn Sie erklären könnten, warum, für weitere Referenz, würde es geschätzt werden. –

+1

Dieses Problem tritt bei der Abhängigkeitsinjektion auf. [MySql.Data.EntityFrameworkCore] (https://www.nuget.org/packages/MySql.Data.EntityFrameworkCore/7.0.6-IR31) hängt bereits von ef.core ab und installiert wahrscheinlich eine andere Version von EF.Core. Durchsuchen Sie jetzt die Datei project.json.lock nach EntityFrameworkCore, nachdem Sie sie entfernt haben. Sie werden feststellen, dass sie noch immer vorhanden ist, aber nicht 1.1.0.Zumindest war das bei mir der Fall. –

1

Angenommen, Sie einen Zusammenhang haben, die etwa wie folgt aussieht:

public class MyContext : DbContext 
{ 
    public MyContext(DbContextOptions<MyContext> options) 
     : base(options) { } 

    public DbSet<SomeEntity> SomeEntities { get; set; } 
    ... 

Ihr Zugang zu diesen Unternehmen durch eine generische Repository wie folgt aussehen würde (wo T ist SomeEntity):

public IList<T> GetAll() 
{ 
    return MyContext.Set<T>.ToList(); 
} 

Sie möchten wahrscheinlich dieses Tutorial here durchgehen, um mehr über den DbContext von Entity Framework Core zu erfahren und über Ihre Entitäten darauf zuzugreifen.