.net core 2.1 mysql 8.0 迁移到 达梦8.4

数据准备:mysql 数据 已经成功迁移到达梦数据库里。如果用不习惯达梦管理工具,可以用 Navicat Premium 17 ,可以连接到达梦数据库。

1、达梦官网下载.net core 2.1 对应的驱动。本地尝试NuGet 包管理器 版本总是对不好(可能是我的问题),不好使,推荐官网下载找到对应的core 2.1版本直接引用dll ,下载地址:产品下载 - 武汉达梦数据库股份有限公司

image

2、代码添加dll引用 DM.DmProvider.dll,DM.Microsoft.EntityFrameworkCore.dll

image

image

image

 

 3、配置达梦数据库

1、appsettings.json 更改配置(注意:ip端口分开写,COMPATIBLE_MODE≠4,改为MySQL,可能是版本不同写4会报错)
"DmConnection": "Server=Ip;Port=5236;Database=DEMO;Uid=SYSDBA;Pwd=Pwd;COMPATIBLE_MODE=MySQL;",

2、opt.UseMySql 改为 opt.UseDm
services.AddDbContext<dmContext>(opt => {            
opt.UseDm(AppSetting.GetSettingString("AppSettings:Dm:DmSqlConnection")); }); 3、dmContext 修改映射 TestDM 为测试实体 public class TestDM { public string EventId { get; set; } public string EventName { get; set; } public DateTime CreateTime { get; set; } } public partial class dmContext : DbContext { public virtual DbSet<TestDM> TestDM { get; set; } private readonly string _connectionString; public dmContext(string connectionString) { _connectionString = connectionString; } public dmContext(DbContextOptions<dmContext> options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { //切换达梦数据库 optionsBuilder.UseDm(_connectionString); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<TestDM>(entity => { entity.ToTable("TESTDM", "DEMO"); // 1. 若EventId是主键 entity.HasKey(e => e.EventId); // 2. 显式配置字段类型为VARCHAR(达梦兼容),指定长度(必须) entity.Property(e => e.EventId) .HasColumnName("EventId") .HasColumnType("VARCHAR") // 达梦字符串核心类型 .HasMaxLength(50) // 必须指定长度,避免驱动默认无长度报错 .IsUnicode(false); // 非Unicode(若无需中文,提升性能);若需中文则设为true(对应NVARCHAR) entity.Property(e => e.EventName) .HasColumnName("EventName") .HasColumnType("VARCHAR") // 达梦字符串核心类型 .HasMaxLength(200); // 必须指定长度,避免驱动默认无长度报错 entity.Property(e => e.CreateTime) .HasColumnName("CreateTime") .HasColumnType("DATE"); // 达梦字符串核心类型 }); } }

4、测试达梦数据库增删改查(先用原生ADO.NET测试,测通后改用 EF Core ORM框架,注意:EF Core的映射)

   public static async Task<bool> TestDM()
   {
       bool bResult = false;
       string connStr = "Server=IP;Port=5236;Database=DEMO;Uid=SYSDBA;Pwd=Pwd;COMPATIBLE_MODE=MySQL;";
       var dmBuilder = new DmConnectionStringBuilder();
       dmBuilder.ConnectionString = connStr; // 触发解析
       Console.WriteLine("✅ 连接字符串解析成功!");
       using (var conn = new DmConnection(connStr))
       {
           try
           {
               // 打开连接
               await conn.OpenAsync();
               Console.WriteLine($"连接状态:{conn.State}");
               Console.WriteLine("✅ 达梦原生驱动连接成功!");

               // 执行简单SQL验证(查询数据库版本)
               //using (var cmd = new DmCommand("SELECT SVR_VERSION FROM V$INSTANCE;", conn))
               //{
               //    var version = await cmd.ExecuteScalarAsync();
               //    Console.WriteLine($"📌 达梦数据库版本:{version}");
               //}

               // 先用原生ADO.NET 测试查询表
               using (var cmd = new DmCommand("SELECT * FROM DEMO.TESTDM", conn))
               {
                   using (var reader = await cmd.ExecuteReaderAsync())
                   {
                       var testDmList = new List<TestDM>();
                       while (await reader.ReadAsync())
                       {
                           var testDm = MapToEntity<TestDM>(reader);
                           testDmList.Add(testDm);
                       }
                   }
               }
               //如果原生ADO.NET 没问题后 在EF Core框架测试
               using (dmContext db = new dmContext())
               {
                   var evt = new TestDM
                   {
                       //EventId = "001",
                       EventName = "修复测试",
                       CreateTime = DateTime.UtcNow
                   };
                   db.TestDM.Add(evt);

                   var result = await db.TestDM.FirstOrDefaultAsync();
                   if (result != null) {
                       result.EventName = "修改后名字";
                       db.SaveChangesAsync();
                   }
                   Console.WriteLine($"修复成功:{result}");        
               }
           }
           catch (Exception ex)
           {
               Console.WriteLine($"❌ 连接失败:{ex.Message}");
               // 打印详细错误(排查用)
               if (ex.InnerException != null)
               {
                   Console.WriteLine($"🔍 内部错误:{ex.InnerException.Message}");
               }
           }
           finally
           {
               if (conn.State == ConnectionState.Open)
               {
                   conn.Close();
               }
           }
       }
       return bResult;
   }

   public static T MapToEntity<T>(DbDataReader reader) where T : new()
   {
       var entity = new T();
       var properties = typeof(T).GetProperties(); // 获取实体所有属性

       foreach (var prop in properties)
       {
           var ordinal = reader.GetOrdinal(prop.Name); // 按属性名找字段索引
           if (!reader.IsDBNull(ordinal))
           {
               // 转换类型并赋值(适配常见类型)
               var value = reader.GetValue(ordinal);
               prop.SetValue(entity, Convert.ChangeType(value, prop.PropertyType));
           }
       }
       return entity;
   }

 

posted @ 2025-11-29 01:45  亦兔子敏  阅读(1)  评论(0)    收藏  举报