2017-05-03 1 views
5

Ich habe ein Problem, dass, wenn ich versuche, ein Feld in meinem PartsDbContext zuzugreifen bekomme ich folgende Fehlermeldung:Entity Framework Kern Verwendung mehrerer DbContexts

System.Data.SqlClient.SqlException: 'Invalid object name 'fieldName''

Es scheint, dass dies, weil ich versuche, Stellen Sie sicher, dass mein PartsDbContext dieselbe Datenbank verwendet wie mein ApplicationDbContext, der mit Identity verwendet wird. Ich muss wissen, wie man einen 2. dbcontext einrichtet, um mit EF-Kern zu arbeiten, der eine unterschiedliche Datenbank benutzt/schafft.

Ich habe versucht, einen zweiten Verbindungszeichenfolge zu schaffen, aber das wird mir diesen Fehler:

System.Data.SqlClient.SqlException: 'Cannot open database "PartsDb" requested by the login. The login failed. Login failed for user 'DESKTOP-4VPU567\higle'.'

Hier ist mein Code:

appsettings.json

"ConnectionStrings": { 
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-PrecisionCustomPC-b14db89e-86ad-4855-a17f-ac64a04339aa;Trusted_Connection=True;MultipleActiveResultSets=true", 
    "PartsConnection": "Server=(localdb)\\mssqllocaldb;Database=PartsDb" 
}, 
"Logging": { 
    "IncludeScopes": false, 
    "LogLevel": { 
     "Default": "Warning" 
    } 
} 

PartsDbContext. cs

public class PartsDbContext : DbContext 
{ 
    public DbSet<PartsViewModels.Tower> Towers { get; set; } 
    public DbSet<PartsViewModels.Motherboard> Motherboards { get; set; } 

    public PartsDbContext(DbContextOptions<PartsDbContext> options) 
     : base(options) 
    { 
    } 
} 

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddIdentity<ApplicationUser, IdentityRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders(); 

    services.AddEntityFramework() 
     .AddDbContext<PartsDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("PartsConnection"))); 

    services.AddMvc(); 

    services.AddAuthorization(options => 
    { 
     options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin")); 
    }); 

    // Add application services. 
    services.AddTransient<IEmailSender, AuthMessageSender>(); 
    services.AddTransient<ISmsSender, AuthMessageSender>(); 
} 

AdminController.cs

[Authorize(Policy = "RequireAdminRole")] 
public class AdminController : Controller 
{ 
    private readonly PartsDbContext _context; 

    public AdminController(PartsDbContext context) 
    { 
     _context = context; 
    } 

    public IActionResult Index() 
    { 
     return View(); 
    } 

    public IActionResult Towers() 
    { 
     var model = _context.Towers.ToList(); 
     return View(model); 
    } 
} 

Die Linie var model = _context.Towers.ToList(); ist, wo der Fehler oben zeigt.

Noch einmal. Ich möchte meinen PartsDbContext so einrichten, dass er mit Entity Framework Core so funktioniert, dass EF-Core die Datenbank automatisch erstellt.

+0

Können Sie TY ersetzen ' "PartsConnection":.„Server = (localdb) \\ mssqllocaldb; Database = PartsDb "' mit '" PartsConnection ":" Server = (localdb) \\ mssqllocaldb; Datenbank = PartsDb; Trusted_Connection = True "?? –

Antwort

7

Ich fand es heraus. Dies geschah hauptsächlich, weil ich versehentlich die Datenbank löschte, die Identity verwendete, und ich musste herausfinden, wie ich sie zurückbekam.

Anscheinend ist nichts falsch mit meiner Verbindungszeichenfolge, wie es ist. Ich brauche nur in den Paket-Manager zu gehen und diese Befehle in dieser Reihenfolge eingeben:

  1. Add-Migration init -Context PartsDbContext
  2. Update-Database -Context PartsDbContext

ich dies herausgefunden, denn das ist, was ich meine ApplicationDbContext zu tun hatte zu bekommen funktioniert wieder und es stellt sich heraus, dass dieser Schritt für Sie getan wird, wenn Sie eine neue MVC Core-Webanwendung in Visual Studio mithilfe der individuellen Benutzerauthentifizierung erstellen.

Also im Grunde die Schritte für mehr DbContexts Zugabe ist:

  1. erstellen DbContext Klasse
  2. Erstellen Sie eine Verbindungszeichenfolge für die DbContext in appsettings.json
  3. Fügen Sie die DbContext zu allen konfigurierten Dienste in Startup.cs
  4. Richten Sie den DbContext in den Controllern ein, die ihn verwenden werden.
  5. Öffnen Sie den Paket-Manager und führen Sie die 2 Zeilen oben aus. (Wenn "-Kontext" versucht nicht arbeiten "--context"
  6. Ihr Programm starten und lassen Sie EntityFrameworkCore kümmern uns um den Rest
+0

Verwenden Sie dieselbe Datenbank mit mehreren Datenbanken? Wie trennen Sie die Migrationen für jeden Kontext in der Tabelle "EFMigrationshistory"? – dotnethaggis

+1

Ich verwende mehrere Datenbanken –

+0

Was ist, wenn beim Start eine Umgebungsbedingung vorliegt, die festlegt, welche appsettings.json-Verbindungszeichenfolge für den gegebenen Kontext verwendet werden soll? Welche eine PM-Konsole wird verwendet? – DiscipleMichael

Verwandte Themen