2017-01-05 5 views
0

Ich habe Probleme beim Implementieren einer abstrakten generischen Basisklasse mit EF Core. Es ist wahrscheinlich etwas offensichtlich, aber ich sehe es nicht.Entwurf der abstrakten generischen DbContext Klasse in EF Core

Basisklasse:

public abstract class AContext<TUser> : IdentityDbContext<TUser> 
    where TUser : IdentityUser { 

    public AContext(DbContextOptions<AContext<TUser>> options, ILogger<AContext<TUser>> logger) 
     : base(options) { 
    } 

} 

Unterklasse:

public class Context : AContext<User> { 

    public Context(DbContextOptions<Context> options, ILogger<Context> logger) 
     : base(options, logger) { // problem is here with "options" 
    } 

} 

Fehler: Cannot convert from 'DbContextOptions<Context>' to 'DbContextOptions<AContext<User>>'.

Ich versuchte Casting, aber das funktioniert nicht. Liegt das Problem daran, dass es nicht kovariant ist? Kann ich es irgendwie neu gestalten?

Antwort

1

Eine DbContextOptions<Context> ist nicht zu DbContextOptions<AContext<TUser>> zuweisbar. Der Grund dafür ist, dass interne Schreiboperationen auf Objekte vom Typ T erfolgen können, die für DbContextOptions<Context>Context wären. DbContextOptions<AContext<TUser>> kann das nicht bieten, denn es ist T ist ein AContext<TUser>.

Covariance ist keine Antwort für Sie, da Co- und Kontravarianz nur für Schnittstellen, nicht für Klassen verfügbar ist.

Wenn Sie den Parametertyp in Ihrem Konstruktor von DbContextOptions<Context> zu DbContextOptions<AContext<User>> ändern, sollte alles gut funktionieren.

+0

Dies funktioniert nicht - obwohl der ASP.NET Core DI-Container kompiliert, ist es nicht möglich, Instanzen des Kontexts zu erstellen. Ich schätze, weil es abstrakt ist. – grokky

+0

Ja, das könnte der Fall sein. Aber das ist unabhängig von der Lösung. Machen Sie Ihre Klasse nicht abstrakt. – Sefe

+0

@grokky: Dieses Problem ist ein anderes als Ihre Frage. Wenn beide Klassen abstrakt sind, wird es in beiden Fällen nicht funktionieren. Das ist eine andere Frage. – Sefe

Verwandte Themen