Невозможно заставить два DbContext работать в одном решении ASP.NET Core с EF Core/SQL Server.C#

Место общения программистов C#
Anonymous
Невозможно заставить два DbContext работать в одном решении ASP.NET Core с EF Core/SQL Server.

Сообщение Anonymous »

Два DbContext для двух отдельных баз данных в одном инфраструктурном проекте (все в одном пространстве имен, если это имеет значение). Все сущности находятся в одном доменном проекте (сущности для каждой базы данных находятся в своем собственном пространстве имен). Ни в одной базе данных нет таблиц с одинаковыми именами.
Исключение при попытке запросить данные:

Microsoft.Data.SqlClient.SqlException (0x80131904): неверное имя объекта «[TABLE_NAME]»

(см. код вызова внизу). Любое гугление, которое я делаю, приводит к тому, что у людей возникают проблемы с миграцией (например, не создается база данных), но это проект, ориентированный на БД, поэтому миграций нет.
Вот мой код соответствующих сервисов для внедрения зависимостей. Какой бы DbContext ни находился внизу, тот и работает. В этом примере «DocumentLibrary» работает, но если я поставлю «HR» внизу, все будет работать. Похоже, это указывает на то, что проблема не в базе данных, строке подключения или конфигурациях объекта.
connectionString = builder.Configuration.GetConnectionString("HR") ?? throw new InvalidOperationException("Connection string 'HR' not found.");
builder.Services.AddDbContext(options =>
// I've tried commenting out all the options except UseSqlServer() to narrow down the issues, but it had no effect
options
.UseSqlServer(connectionString)
.EnableDetailedErrors()
.UseLazyLoadingProxies()
);

connectionString = builder.Configuration.GetConnectionString("DocumentLibrary") ?? throw new InvalidOperationException("Connection string 'DocumentLibrary' not found.");
builder.Services.AddDbContext(options =>
// I've tried commenting out all the options except UseSqlServer() to narrow down the issues, but it had no effect
options
.UseSqlServer(connectionString)
.EnableDetailedErrors()
.UseLazyLoadingProxies()
);

Упрощенный файл DbContext. Оба одинаковы, за исключением имен и объектов:
public class HrDbContext : DbContext
{
public HrDbContext(DbContextOptions options)
: base(options)
{
}

public DbSet Employees => Set();
// other DbSets...

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder); // I've moved this to the top and bottom with no effect

builder.ApplyConfiguration(new EmployeeConfiguration());
// other entity configurations
}
}

Упрощенный пример конфигурации объекта:
public class EmployeeConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.HasKey(pk => pk.Id);
builder.ToTable("Employee");
// other configurations
}
}

Тестовая страница, на которой возникает исключение:
// This is just a test for working through this issue. I know injecting a DbContext into a page is generally bad practice.
public class DbContextTestModel(HrDbContext hrDbContext, DocumentLibraryDbContext documentLibraryDbContext) : PageModel
{
public async Task OnGet()
{
// works when it's the last DbContext declared, fails if it's first
var doc = await documentLibraryDbContext.Documents.OrderBy(x => x.Id).FirstOrDefaultAsync();

// works when it's the last DbContext declared, fails if it's first
var employee = await hrDbContext.Employees.OrderBy(x => x.Id).FirstOrDefaultAsync();
}
}

Вернуться в «C#»