Entity Framework Core 2.1 - несколько провайдеров - PullRequest
0 голосов
/ 17 сентября 2018

Как правильно работать с несколькими провайдерами? Мой пример:

appsettings.json

{
  "ConnectionStrings": {
    "Sqlite": "Data Source=database.db"
  }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     services.AddDbContext<DatabaseContext>(options =>
                    options.UseSqlite(Configuration.GetConnectionString("Sqlite")));
}

DatabaseContext.cs

public class DatabaseContext : DbContext
{
    public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) { }
    public DbSet<TestModel> TestModel{ get; set; }
}

Простой способ для нескольких провайдеров?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Возможно, вы захотите рассмотреть такую ​​утилиту, как AdaptiveClient .AdaptiveClient позволяет вам создать один DbContext с несколькими реализациями ваших сервисов (MSSQL, MySQL, SQLite и т. Д.) Для конкретного поставщика.AdaptiveClient внедряет правильную реализацию в зависимости от используемой строки подключения.

AdaptiveClient также позволяет внедрять специфичные для транспорта реализации служб.Например, многие приложения работают как локально (та же ЛВС, что и сервер базы данных), так и удаленно (используйте WCF или REST).При локальном запуске AdaptiveClient внедрит реализацию вашего сервиса, которая напрямую обращается к вашей базе данных.Это дает ~ 10-кратное улучшение производительности.При удаленном запуске AdaptiveClient внедряет реализацию WCF или REST.

См. Также:

AdaptiveClient.EntityFrameworkCore

Демонстрационное приложение

AdaptiveClient доступен в виде пакета nuget .

Отказ от ответственности: я являюсь автором AdaptiveClient.

0 голосов
/ 18 сентября 2018

Решение только с одним контекстом (пример для SQLite + MySQL + MSSQL + PostgreSQL (или других)):

appsettings.json

{
  // Add Provider and ConnectionStrings for your EFC drivers
  // Providers: SQLite, MySQL, MSSQL, PostgreSQL, or other provider...
  "Provider": "SQLite",
  "ConnectionStrings": {
    "SQLite": "Data Source=mydatabase.db",
    "MySQL": "server=localhost;port=3306;database=mydatabase;user=root;password=root",
    "MSSQL": "Server=(localdb)\\mssqllocaldb;Database=mydatabase;Trusted_Connection=True;MultipleActiveResultSets=true",
    "PostgreSQL": "Host=localhost;Database=mydatabase;Username=root;Password=root"
  }
}

Один DatabaseContext.cs

public class DatabaseContext : DbContext
{
        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) { }

        // add Models...
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // Check Provider and get ConnectionString
    if (Configuration["Provider"] == "SQLite")
    {
        services.AddDbContext<DatabaseContext>(options =>
            options.UseSqlite(Configuration.GetConnectionString("SQLite")));
    }
    else if (Configuration["Provider"] == "MySQL")
    {
        services.AddDbContext<DatabaseContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("MySQL")));
    }
    else if (Configuration["Provider"] == "MSSQL")
    {
        services.AddDbContext<DatabaseContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MSSQL")));
    }
    else if (Configuration["Provider"] == "PostgreSQL")
    {
        services.AddDbContext<DatabaseContext>(options =>
            options.UseNpgsql(Configuration.GetConnectionString("PostgreSQL")));
    }
    // Exception
    else
    { throw new ArgumentException("Not a valid database type"); }
}

Теперь мы можем выполнить миграцию сингла

Add-Migration InitialCreate

Редактировать только все выходные данные Add-Migration и добавлять специфичные для драйвера атрибуты :

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
        name: "Mytable",
        columns: table => new
        {
            Id = table.Column<int>(nullable: false)
            // Add for SQLite
            .Annotation("Sqlite:Autoincrement", true)
            // Add for MySQL
            .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn)
            // Add for MSSQL
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
            // Add for PostgreSQL
            .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn),
            // Or other provider...
            Name = table.Column<string>(maxLength: 50, nullable: false),
            Text = table.Column<string>(maxLength: 100, nullable: true)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Mytable", x => x.Id);
        });
    }

EDIT: или вы используете строковый идентификатор "DatabaseGenerated" таким образом, вам не нужно будет редактировать миграцию миграции, а добавление миграции может выполняться несколькими поставщиками без ".Annotation"

ПРИМЕР Модель:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace WebApplication.Models
{
    public class Mytable
    {
        // This generate a String ID
        // No ID modification needed for providers
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public string Id { get; set; }

        // ....
    }
}

Теперь готов к обновлению базы данных

...