Entity Framework Core Using multiple DbContexts

Mam problem, że podczas próby uzyskania dostępu do pola w PartsDbContext dostaję następujący błąd:

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

Wydaje się, że dzieje się tak dlatego, że staram się, aby moje PartsDbContext używało tej samej bazy danych, co mój ApplicationDbContext, który jest używany z tożsamością. Muszę wiedzieć, jak skonfigurować drugi dbcontext do pracy z EF core, który używa / tworzy inną bazę danych.

Próbowałem utworzyć 2. łańcuch połączeń, ale to powoduje ten błąd:

System.Data.SqlClient.SqlException: 'nie można otworzyć bazy danych "PartsDb" żądanej przez login. Logowanie nie powiodło się. Login failed for user 'DESKTOP-4VPU567\higle'.'

Oto Mój kod:

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"
    }
}

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

The linia var model = _context.Towers.ToList(); jest miejscem, w którym pojawia się błąd.

Jeszcze raz. Chcę skonfigurować mój PartsDbContext do pracy z Entity Framework Core w taki sposób, że EF-Core automatycznie utworzy bazę danych.
Author: Joe Higley, 2017-05-03

2 answers

Rozgryzłem to. Stało się to głównie dlatego, że przypadkowo usunąłem bazę danych, której używała tożsamość i musiałem dowiedzieć się, jak ją odzyskać.

Najwyraźniej nie ma nic złego w moim łańcuchu połączeń, tak jak jest. Po prostu musiałem wejść do menedżera pakietów i wpisać te polecenia w następującej kolejności:

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

Odkryłem to, ponieważ to było to, co musiałem zrobić, aby mój ApplicationDbContext znowu działał i okazało się, że ten krok jest wykonywany podczas tworzenia nowej aplikacji webowej MVC Core w Visual Studio przy użyciu uwierzytelniania indywidualnego użytkownika.

Więc w zasadzie kroki do dodawania więcej DbContext jest do:

  1. Tworzenie klasy DbContext
  2. Utwórz Łańcuch Połączenia dla tego DbContext w appsettings.json
  3. Dodaj DbContext do skonfigurowanych usług podczas uruchamiania .cs
  4. Ustaw DbContext w kontrolerach, które będą używać to.
  5. otwórz menedżera pakietów i uruchom 2 linie powyżej. (jeśli "-Context" nie działa, spróbuj "--context "
  6. Uruchom swój program i pozwól EntityFrameworkCore zająć się resztą.
 37
Author: Joe Higley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 03:04:55

Nie mogę jeszcze skomentować, ale chciałbym dodać do odpowiedzi.

Obecnie pracuję nad tym tutorialem: https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/model?view=aspnetcore-5.0&tabs=visual-studio

Ale ja też zacząłem od ApplicationDbContext dla tożsamości. Więc napotkałem podobny problem. Twoja odpowiedź mi pomogła, dzięki!

Tutorial sugeruje jednak czystszy sposób na to.

  1. Dodaj dane model
  2. rusztować model danych!

Ten krok jest ogromny. Tworzy klasę Context, łańcuch połączeń w appsettings.json, dodaje kontekst w startupie .cs i nie tylko. W przypadku korzystania z rusztowań zapoznaj się z linked tutorial.

  1. Uruchom podane polecenia w PMC i jesteś ustawiony.
    • add-Migration INIT-Context ModelContext
    • Update-Database-Context ModelContext

Sugerowałbym więc użycie rusztowania, ponieważ najbardziej Ci odpowiada.

 0
Author: JayPi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-21 12:20:44