zoukankan      html  css  js  c++  java
  • .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)  

    此间不逝,岁岁年年。
  • 相关阅读:
    抽象类的子类能够new
    Codeforces Round #250 (Div. 2) A
    软件架构设计箴言理解
    UVA1422-Processor(二分法+优先队列)
    猜你喜欢-----推荐系统原理介绍
    Android------Intent.createChooser
    mongodb3.0 性能測试报告 二
    *Android 多线程下载 仿下载助手(改进版)
    Gson解析数组和list容器
    oracle dbms_repcat_admin能带来什么安全隐患
  • 原文地址:https://www.cnblogs.com/ZCrystal/p/10783710.html
Copyright © 2011-2022 走看看