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.
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:
Add-Migration init -Context PartsDbContext
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:
- Tworzenie klasy DbContext
- Utwórz Łańcuch Połączenia dla tego DbContext w appsettings.json
- Dodaj DbContext do skonfigurowanych usług podczas uruchamiania .cs
- Ustaw DbContext w kontrolerach, które będą używać to.
- otwórz menedżera pakietów i uruchom 2 linie powyżej. (jeśli "-Context" nie działa, spróbuj "--context "
- Uruchom swój program i pozwól EntityFrameworkCore zająć się resztą.
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.
- Dodaj dane model
- 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.
- 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.
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