Entity Framework: две схемы базы данных, одна без контекста БД - PullRequest
0 голосов
/ 04 декабря 2018

Я пытался установить соединение двух схем в моем приложении.

Я объясню вам: у меня есть приложение, которое использует свои собственные таблицы, поэтому я создал таблицы с миграцией и моделями и DbContext, затем я разместил таблицы в базе данных SQL Server, в которой есть другиесхемы из других приложений и все ок.Одно приложение подключается и получает данные.

Но мое приложение должно быть подключено к одной из других схем, которые есть в моей базе данных SQL Server, другая схема имеет ту же строку подключения, потому что они находятся на одном сервере.

Я также написал контекст в 2 дБ в startup.cs / ConfigureServices

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(_config.GetConnectionString("TrialOrdersConnectionString"), x => x.MigrationsHistoryTable("__MyMigrationsHistory", "trials")));
services.AddScoped(p => new ApplicationDbContext(p.GetService<DbContextOptions<ApplicationDbContext>>()));
//services.AddDbContext<AppDbContext_serie>(options => options.UseSqlServer(_config.GetConnectionString("Serie0ConnectionString")));

Но, конечно, поскольку у меня на самом деле нет applicationDbContext другой схемы, она не распознается.

Я попытался повторить контекст базы данных приложения другой схемы, чтобы получить модели и вызвать их, но в моей миграции он снова создает базу данных :( и я этого не хочу.

IЯ использую .Net Core и Angular.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Для доступа к таблице в базе данных, но не в DbContext, вы можете попробовать Query.

Например.В базе данных есть таблица с именем PersonNotInDbContext, которой нет в DbContext.

  • Таблица в базе данных

    CREATE TABLE [dbo].[PersonNotInDbContext] (
     [Id]   INT        NOT NULL,
     [Name] NCHAR (10) NULL,
     PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
  • Определить новую модель, которая сопоставила возвращаемые столбцы из SQL-запроса.

    public class TableNotInDbContext
    {
         public int Id { get; set; }
         public string Name { get; set; }
    }
    
  • Настройка Query в DbContext

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    
    }
    public DbSet<TodoItem> TodoItem { get; set; }
    
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    
        builder.Query<TableNotInDbContext>();
    }
    }
    
  • Использование

        public async Task<IActionResult> DbQuery()
    {
        var result = await _context.Query<TableNotInDbContext>()
                                   .FromSql($"Select * From PersonNotInDbContext")
                                   .ToListAsync();
        return Ok(result);
    }
    

    По Типы запросов , вы сможете запускать необработанные запросы с DbContext.

0 голосов
/ 04 декабря 2018

При настройке DI у вас есть 2 разных экземпляра, настроенных для типа ApplicationDbContext.Насколько я знаю, поведение для этого будет:

  • инъекция для ApplicationDbContext будет вводить первое (определение AddDbContext).
  • инъекция для IEnumerable<ApplicationDbContext> будет внедрять оба контекста.

Примечание: Не уверен, что регистрация типа действует так же, как регистрация интерфейса в этом случае, может также2-й регистр переопределяет первый.

Обходным путем может быть создание 2-го класса DbContext, который наследуется от ApplicationDbContext, затем настройка 2-го класса со 2-й строкой соединения.Но вы должны знать, какой из них вы хотите использовать при использовании DI.

В противном случае пользовательский DbContextProvider может быть решением, позволяющим вам выбрать, какой DbContext вы используете.Я разместил пример кода для одного в этом вопросе:

Обработка нескольких строк подключения в основном веб-интерфейсе asp.net, который стал параметром

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...