Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用实体框架处理多数据库类型支持_Sql Server_Asp.net Core_Entity Framework Core_Mariadb - Fatal编程技术网

Sql server 如何使用实体框架处理多数据库类型支持

Sql server 如何使用实体框架处理多数据库类型支持,sql-server,asp.net-core,entity-framework-core,mariadb,Sql Server,Asp.net Core,Entity Framework Core,Mariadb,我需要在项目中支持MariaDb和SqlServer的迁移。 目前,我编辑了通过添加迁移命令创建的迁移文件。您可以看到迁移文件的某些部分 migrationBuilder.CreateTable( name: "Tbl1", columns: table => new { Id = table.Column<long>(nullable: false)

我需要在项目中支持MariaDb和SqlServer的迁移。 目前,我编辑了通过添加迁移命令创建的迁移文件。您可以看到迁移文件的某些部分

migrationBuilder.CreateTable(
            name: "Tbl1",
            columns: table => new
            {
                Id = table.Column<long>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1")
                    .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
                Name = table.Column<string>(maxLength: 100, nullable: true),
                Measurement = table.Column<string>(maxLength: 100, nullable: true),
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Tbl1", x => x.Id);
            });
migrationBuilder.CreateTable(
名称:“Tbl1”,
列:表=>new
{
Id=table.Column(可空:false)
.Annotation(“SqlServer:Identity”、“1,1”)
.Annotation(“MySql:ValueGenerationStrategy”,MySqlValueGenerationStrategy.IdentityColumn),
Name=table.Column(maxLength:100,null:true),
测量=表列(最大长度:100,可为空:真),
},
约束:表=>
{
表.PrimaryKey(“PK_Tbl1”,x=>x.Id);
});
通过这种更改,我的迁移文件可以同时支持两种数据库类型(MariaDb和SqlServer)。 但是,我必须为两者设置并使用相同的ColumnType。 我想知道Entityframework是否提供了支持多种数据库类型的最佳实践?

请看下面两种方法中的哪种方法正好讨论了该场景:

两个迁移集 在第一种方法中,您为每个模型更改生成两个迁移

一种方法是将每个迁移集放在单独的程序集中,并在添加两个迁移之间手动切换活动提供程序(和迁移程序集)

另一种使使用这些工具更容易的方法是创建一个从DbContext派生的新类型,并重写活动提供程序。添加或应用迁移时,此类型在设计时使用

类MySqliteDbContext:MyDbContext
{
配置时受保护的覆盖无效(DbContextOptionsBuilder选项)
=>options.UseSqlite(“数据源=my.db”);
}

由于每个迁移集都使用自己的DbContext类型,因此这种方法不需要 需要使用单独的迁移程序集

一个迁移集 如果您不喜欢有两组迁移,可以手动将它们组合成一组,并应用于两个提供程序

注释可以共存,因为提供程序会忽略它不理解的任何注释。例如,同时使用Microsoft SQL Server和SQLite的主键列可能如下所示

Id=table.Column(可空:false)
.Annotation(“SqlServer:ValueGenerationsStrategy”,
SqlServerValueGenerationStrategy.Identity列)
.Annotation(“Sqlite:Autoincrement”,true),
如果操作只能应用于一个提供程序,或者提供程序之间的操作不同,请使用ActiveProvider属性确定哪个提供程序处于活动状态:

if(migrationBuilder.ActiveProvider==“Microsoft.EntityFrameworkCore.SqlServer”)
{
migrationBuilder.CreateSequence(
名称:“EntityFrameworkHiLoSequence”);
}

Pomelo.EntityFrameworkCore.MySql特定 另请参阅和参考资料,了解如何处理MySQL和MariaDB不知道什么是SQL Server模式(例如,
dbo
)的情况(假设您正在使用 作为访问MariaDB数据库的提供者)

以下是一些代码选项:

//如果正在使用架构,则引发异常。这是默认设置。
使用MySQL(myConnectionString,b=>b.SchemaBehavior(MySqlSchemaBehavior.Throw))
//静默忽略任何模式定义。
使用MySQL(myConnectionString,b=>b.SchemaBehavior(MySqlSchemaBehavior.Ignore))
//使用指定的转换器委托将输入架构和对象名称转换为
//每当使用架构时,输出对象名称。
使用mysql(myConnectionString,b=>b.SchemaBehavior(MySqlSchemaBehavior.Translate,
(模式,实体)=>$“{schema??“dbo”}{entity}”))
看一看,哪种方法使用以下两种方法准确地讨论了该场景:

两个迁移集 在第一种方法中,您为每个模型更改生成两个迁移

一种方法是将每个迁移集放在单独的程序集中,并在添加两个迁移之间手动切换活动提供程序(和迁移程序集)

另一种使使用这些工具更容易的方法是创建一个从DbContext派生的新类型,并重写活动提供程序。添加或应用迁移时,此类型在设计时使用

类MySqliteDbContext:MyDbContext
{
配置时受保护的覆盖无效(DbContextOptionsBuilder选项)
=>options.UseSqlite(“数据源=my.db”);
}

由于每个迁移集都使用自己的DbContext类型,因此这种方法不需要 需要使用单独的迁移程序集

一个迁移集 如果您不喜欢有两组迁移,可以手动将它们组合成一组,并应用于两个提供程序

注释可以共存,因为提供程序会忽略它不理解的任何注释。例如,同时使用Microsoft SQL Server和SQLite的主键列可能如下所示

Id=table.Column(可空:false)
.Annotation(“SqlServer:ValueGenerationsStrategy”,
SqlServerValueGenerationStrategy.Identity列)
.Annotation(“Sqlite:Autoincrement”,true),
如果操作只能应用于一个提供程序,或者提供程序之间的操作不同,请使用ActiveProvider属性确定哪个提供程序处于活动状态:

if(migrationBuilder.ActiveProvider==“Microsoft.EntityFrameworkCore.SqlServer”)
{
migrationBuilder.CreateSequence(
名称:“EntityFrameworkHiLoSequence”);
}

Pomelo.EntityFrameworkCore.MySql特定 另请参阅和参考资料,了解如何处理MySQL和MariaDB不知道什么是SQL Server模式(例如,
dbo
)的情况(假设您正在使用 作为证明
dotnet ef migrations add InitialCreate --context MyDbContext --output-dir Migrations/SqlServerMigrations
dotnet ef migrations add InitialCreate --context MySqliteDbContext --output-dir Migrations/SqliteMigrations