.net core 2.1 mysql 8.0 迁移到 达梦8.4
数据准备:mysql 数据 已经成功迁移到达梦数据库里。如果用不习惯达梦管理工具,可以用 Navicat Premium 17 ,可以连接到达梦数据库。
1、达梦官网下载.net core 2.1 对应的驱动。本地尝试NuGet 包管理器 版本总是对不好(可能是我的问题),不好使,推荐官网下载找到对应的core 2.1版本直接引用dll ,下载地址:产品下载 - 武汉达梦数据库股份有限公司

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



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; }
落座船头,看风起云涌,赏繁花似锦

浙公网安备 33010602011771号