it-swarm.com.de

Entity Framework Core Verwenden mehrerer DbContexts

Ich habe das Problem, dass beim Versuch, auf ein Feld in meinem PartsDbContext zuzugreifen, die folgende Fehlermeldung angezeigt wird:

System.Data.SqlClient.SqlException: 'Ungültiger Objektname' fieldName ''

Es scheint, dass dies daran liegt, dass ich versuche, meinen PartsDbContext dazu zu bringen, dieselbe Datenbank zu verwenden wie meinen ApplicationDbContext, der mit Identity verwendet wird. Ich muss wissen, wie man einen 2. dbcontext einrichtet, um mit EF-Kern zu arbeiten, der eine andere Datenbank verwendet/verursacht.

Ich habe versucht, eine zweite Verbindungszeichenfolge zu erstellen, aber dadurch erhalte ich den folgenden Fehler:

System.Data.SqlClient.SqlException: 'Datenbank "PartsDb" kann nicht geöffnet werden, angefordert durch die Anmeldung. Die Anmeldung ist fehlgeschlagen. Anmeldung für Benutzer 'DESKTOP-4VPU567\higle' fehlgeschlagen. '

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);
    }
}

In der Zeile var model = _context.Towers.ToList(); wird der Fehler angezeigt.

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

20
Joe Higley

Ich habe es herausgefunden. Dies ist hauptsächlich darauf zurückzuführen, dass ich die von Identity verwendete Datenbank versehentlich gelöscht habe und herausfinden musste, wie ich sie wiederherstellen kann.

Anscheinend stimmt nichts mit meinem Verbindungsstring so, wie er ist. Ich musste nur in den Paket-Manager gehen und diese Befehle in dieser Reihenfolge eingeben:

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

Ich habe dies herausgefunden, weil ich genau das tun musste, um meinen ApplicationDbContext wieder funktionsfähig zu machen, und es stellte sich heraus, dass dieser Schritt für Sie ausgeführt wird, wenn Sie eine neue MVC Core-Webanwendung in Visual Studio mithilfe der Authentifizierung einzelner Benutzer erstellen.

Die Schritte zum Hinzufügen weiterer DbContexts lauten also im Wesentlichen:

  1. Erstellen Sie eine DbContext-Klasse
  2. Erstellen Sie eine Verbindungszeichenfolge für diesen DbContext in appsettings.json
  3. Fügen Sie den DbContext zu Ihren konfigurierten Diensten in Startup.cs hinzu
  4. Richten Sie den DbContext in den Controllern ein, die ihn verwenden werden.
  5. Öffnen Sie den Paketmanager und führen Sie die beiden obigen Zeilen aus. (Wenn "-Context" nicht funktioniert, versuchen Sie es mit "--context".
  6. Führen Sie Ihr Programm aus und lassen Sie EntityFrameworkCore den Rest erledigen.
22
Joe Higley