Ядро Entity Framework с использованием нескольких DbContexts
У меня возникла проблема: при попытке доступа к полю в моем PartDbContext я получаю следующую ошибку:
System.Data.SqlClient.SqlException: 'Недопустимое имя объекта' fieldName ''
Похоже, что это связано с тем, что я пытаюсь заставить мой PartDbContext использовать ту же базу данных, что и мой ApplicationDbContext, который используется с Identity. Мне нужно знать, как настроить 2-й dbcontext для работы с ядром EF, который использует/создает другую базу данных.
Я пробовал создать вторую строку соединения, но мне эта ошибка:
System.Data.SqlClient.SqlException: "Не удается открыть базу данных" PartsDb ", запрошенную при входе в систему. Ошибка входа в систему. Ошибка входа для пользователя" DESKTOP-4VPU567\higle". '
Здесь мой код:
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);
}
}
В строке var model = _context.Towers.ToList();
появляется ошибка.
Еще раз. Я хочу настроить свой PartDbContext для работы с ядром Entity Framework таким образом, что EF-Core автоматически создаст базу данных.
Ответы
Ответ 1
Я понял это. Это произошло главным образом из-за того, что я случайно удалил базу данных, которую использовал Identity, и мне нужно было выяснить, как ее вернуть.
По-видимому, нет ничего плохого в моей строке подключения так, как она есть. Мне просто нужно было войти в диспетчер пакетов и ввести эти команды в следующем порядке:
-
Add-Migration init -Context PartsDbContext
-
Update-Database -Context PartsDbContext
Я нашел это, потому что это то, что я должен был сделать, чтобы снова запустить мой ApplicationDbContext, и выясняется, что этот шаг выполняется для вас, когда вы создаете новое веб-приложение MVC Core в Visual Studio с использованием индивидуальной аутентификации пользователей.
Итак, в основном шаги для добавления дополнительных DbContexts заключаются в следующем:
- Создать класс DbContext
- Создайте строку Connection для этого DbContext в appsettings.json
- Добавьте DbContext к вашим настроенным сервисам в Startup.cs
- Установите DbContext в контроллерах, которые будут использовать его.
- Откройте диспетчер пакетов и запустите 2 строки выше. (если "-Контекст" не работает, попробуйте "--context"
- Запустите программу и пусть EntityFrameworkCore позаботится об остальном.
Ответ 2
Здесь статья описывает, как работать с несколькими различными DBContexts и одной БД. И примеры кода. Entity Framework Core с несколькими контекстами, схемами и проектами БД