2017-04-06 4 views
0

Ich weiß, dass diese Frage mehrmals gestellt wurde, aber ich habe meine Lösung noch nicht bekommen.DotNet Core, Kein Datenbankprovider wurde für diesen DbContext konfiguriert

Ich bin sehr neu in DotNet Core. Mein Problem ist, ich möchte Daten aus meiner Tabelle "Header" mit einem einfachen Linq-Befehl auswählen, aber ich sah unter Fehler.

Weitere Informationen: Für diesen DbContext wurde kein Datenbankprovider für konfiguriert. Ein Provider kann durch Überschreiben der DbContext.OnConfiguring-Methode oder mithilfe von AddDbContext für den Anwendungsdienstanbieter konfiguriert werden. Wenn AddDbContext verwendet wird, dann stellen Sie auch sicher, dass Ihr DbContext-Typ ein DbContextOptions-Objekt in seinem Konstruktor akzeptiert und es an den Basiskonstruktor für DbContext übergibt.

Mein Controller ist.

public HeaderModel GetHeaderInformation() 
    { 
     using(var context = new ApplicationDbContext()) 
     { 
      var header = context.Headers.Select(x => new HeaderModel 
      { 
       colorCode = x.colorCode, 
       height = x.height, 
       Id = x.Id, 
       left = x.left, 
       top = x.top, 
       width = x.width 
      }).FirstOrDefault(); 

      return header; 
     } 
    } 

Mein ApplicationDbContext ist.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> //DbContext 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
     : base(options) 
    { 
    } 

    public ApplicationDbContext() : base() 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     base.OnModelCreating(builder); 
     // Customize the ASP.NET Identity model and override the defaults if needed. 
     // For example, you can rename the ASP.NET Identity table names and more. 
     // Add your customizations after calling base.OnModelCreating(builder); 
    } 

    public DbSet<Header> Headers { get; set; } 
    public DbSet<Menu> Menus { get; set; } 
} 

Und meine startup.cs ist.

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 
     services.AddApplicationInsightsTelemetry(Configuration); 
     services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders(); 
     services.AddMvc(); 

Danke für Ihre Hilfe.

Antwort

6

Sie verwenden die Abhängigkeitsinjektion. services.AddDbContext ist verantwortlich für die Erstellung eines DbContext-Objekts. Es hat keinen Sinn, Block zu verwenden, weil Sie dadurch einen neuen ApplicationDbContext erstellen, der keine Verbindungszeichenfolge enthält.


Schreiben Sie Methode wie folgt:

public HeaderModel GetHeaderInformation(ApplicationDbContext context) 
{ 
    // the code inside your using block 
} 

und .Net den Kontext über Dependency Injection lösen.



Des Weiteren ist eine gängige Praxis, die DbContext als private Nur-Lese-atribute in Ihrem Konstruktor Klasse haben. So können Sie etwas wie folgt tun:

public class MyConroller : Controller 
{ 
    private readonly MyDbContext _context; 

    public MyConroller(MyDbContext ctx) 
    { 
     _context = ctx; 
    } 
} 

und verwenden Sie einfach das Kontextattribut in Ihren Methoden.

+0

Vielen Dank für Ihre Antwort, ich möchte nur meine dbContext im using-Block neu und verwenden Sie DbSet <> zum Auswählen, Hinzufügen und Löschen von Daten. Ihre Lösung ist in Ordnung, aber sie hat mein Problem nicht gelöst. –

+0

Wie kann ich den dbcontext in die Konstruktoren von Klassen, die keine Controller sind, einfügen lassen? – zuckerthoben

+0

@zuckerthoben hast du die Antwort auf diese Frage [hier] (https://stackoverflow.com/questions/37189984/dependency-injection-with-classes-other-than-a-controller-class) :) – 5ar

0

Sie sollten Ihren parameterlosen Konstruktor entfernen, da dieser wahrscheinlich aufgerufen wird, wenn eine neue Instanz vom DI erstellt wird. Ich weiß, dass dies für einige Leute das Problem war, ich hoffe es hilft.

Verwandte Themen