.NET SQLServer数据库转MySql

Posted zcrystal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET SQLServer数据库转MySql相关的知识,希望对你有一定的参考价值。

  第一步:找到下图两个组件,卸载。

    技术图片

    技术图片

  第二步:NuGet下载下图组件。

    技术图片

  第三步:在连接数据库OnConfiguring方法处,做如下修改:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
optionsBuilder.Usemysql(config.GetConnectionString("DefaultConnection"));
}

第四步:映射的字段属性。

  有三个字段类性需要重点说一下 GUID、DateTimeOffset、bool

    1. GUID类型在SQLServer能用,却不能被MySql使用,所以所有的GUID类型的字段属性在换数据库的时候,MySql表的此字段都要指定变更为varchar类型。在代码中 .NET的string对应MySql数据库的varchar,所以在代码中映射时如下:

public class TestMap : EntityMappingConfiguration<TestEntity>
{
public override void Map(EntityTypeBuilder<TestEntity> builder)
{
builder.ToTable("Base_Test").HasKey(c => c.TestId);
builder.Property(c => c.TestId).HasColumnName("TestId").HasColumnType("string");
builder.Property(c => c.IsDeleted).HasColumnName("IsDeleted").HasColumnType("bit");
builder.Property(c => c.CreateDateTime).HasColumnName("CreateDateTime");
}
}

若不加.HasColumnType("bit")则会报如下图的错误。

(Unable to cast object of type ‘System.String‘ to type ‘System.Byte[]‘.)

技术图片

 

    2. DateTimeOffset类型在SQLServer能用,却不能被MySql使用,所以所有的DateTimeOffset类型的字段属性在换数据库的时候,MySql表的此字段都要指定变更为DateTime类型。

public class TestMap : EntityMappingConfiguration<TestEntity>
{
public override void Map(EntityTypeBuilder<TestEntity> builder)
{
builder.ToTable("Base_Test").HasKey(c => c.TestId);
builder.Property(c => c.TestId).HasColumnName("TestId").HasColumnType("string");
builder.Property(c => c.CreateDateTime).HasColumnName("CreateDateTime");
}
}

    3. 所有的bool类型的字段属性在换数据库的时候,可指定变更为bit类型。在代码中 .NET的 bool对应MySql数据库的bit,所以在代码中映射时如下:

public class TestMap : EntityMappingConfiguration<TestEntity>
{
public override void Map(EntityTypeBuilder<TestEntity> builder)
{
builder.ToTable("Base_Test").HasKey(c => c.TestId);
builder.Property(c => c.TestId).HasColumnName("TestId").HasColumnType("string");
builder.Property(c => c.IsDeleted).HasColumnName("IsDeleted").HasColumnType("bit");
builder.Property(c => c.CreateDateTime).HasColumnName("CreateDateTime");
}
}

若不加.HasColumnType("bit")则可能会报如下图的错误。

(System.InvalidOperationException:“No coercion operator is defined between types ‘System.Int16‘ and ‘System.Boolean‘.”)

技术图片

若程序中定义的字段属性与数据库表中的字段属性对应不上,则可能会报如下图的错误。

(Unable to cast object of type ‘System.String‘ to type ‘System.Byte[]‘.)

    至此,换库完成。

 

  已解决,但不理解的问题:var test = db.Test.Any(i => i.IsDelected==true)  会报如下错误:

    (System.InvalidOperationException:“No coercion operator is defined between types ‘System.Int16‘ and ‘System.Boolean‘.”)

             技术图片

 

    解决方法:先ToList()即可,

                      var test = db.Test.ToList().Any(i => i.IsDelected==true)  

以上是关于.NET SQLServer数据库转MySql的主要内容,如果未能解决你的问题,请参考以下文章

sql server迁移到mysql

[转] 利用任务计划重启sqlserver服务

转:SqlServer2012自增列值突然增大1000的原因及解决方法

[转]SQLServer SQL执行效率和性能测试方法总结

[转]VS 2013 连接数据库报错 未能加载文件或程序集 Microsoft.SqlServer.Management.Sdk.Sfc

Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)