Ядро 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 позаботится об остальном.