C# WPF上位机开发:FreeSql+MVVM实战避坑指南(含MySQL/SQLServer双数据库配置)
C# WPF上位机开发FreeSqlMVVM实战避坑指南含MySQL/SQLServer双数据库配置从Java转型到C# WPF开发的工程师们往往会在MVVM架构下遇到数据库集成的各种坑。本文将分享如何用FreeSql这一轻量级ORM框架在工业级上位机项目中实现高效、稳定的数据持久化方案。不同于简单的语法介绍我们聚焦于实际开发中三个最棘手的场景架构冲突规避、双数据库适配和ViewModel映射优化。1. 架构设计如何让FreeSql与MVVM和谐共处MVVM模式强调分层解耦而传统ORM往往倾向于侵入式设计。这种理念冲突在实际项目中表现为两种典型问题一是数据库操作污染ViewModel层二是变更通知机制与ORM的自动跟踪产生冲突。解决方案的核心在于建立清晰的隔离层// Database层接口定义 public interface IDatabaseServiceT where T : class { TaskIEnumerableT GetAllAsync(); TaskT GetByIdAsync(long id); Taskint InsertAsync(T entity); Taskint UpdateAsync(T entity); Taskbool DeleteAsync(long id); }实现时需要注意三个关键点生命周期管理推荐使用单例模式管理FreeSql实例线程安全确保所有数据库操作都在后台线程执行异常处理统一封装数据库异常为业务友好型异常提示避免在ViewModel中直接调用FreeSql的复杂API应该通过中间层进行抽象2. 双数据库配置MySQL与SQLServer的无缝切换工业场景中常需要同时支持多种数据库。FreeSql的DataType枚举虽然支持多种数据库类型但实际配置时仍有以下注意事项配置项MySQL注意事项SQLServer注意事项连接字符串需要指定Pooling参数建议开启MultipleActiveResultSets事务隔离级别默认RepeatableRead默认ReadCommitted分页语法Limit/OffsetOffset/Fetch Next时间类型处理需处理时区问题注意datetime2精度典型的多数据库配置方案// 在App.xaml.cs中初始化 var dbType ConfigurationManager.AppSettings[DatabaseType]; var connectionString ConfigurationManager.ConnectionStrings[dbType].ConnectionString; var freeSql new FreeSqlBuilder() .UseConnectionString( dbType MySQL ? DataType.MySql : DataType.SqlServer, connectionString) .UseAutoSyncStructure(false) // 生产环境建议关闭 .UseMonitorCommand(cmd Debug.WriteLine(cmd.CommandText)) .Build(); // 注册为单例服务 ServiceLocator.Default.RegisterInstanceIFreeSql(freeSql);3. 实体类与ViewModel的映射技巧ORM实体与ViewModel的自动映射常会遇到以下问题循环引用导致序列化失败导航属性加载时机不当变更通知与ORM跟踪冲突推荐采用分层映射策略基础实体层仅包含数据库字段public class DeviceEntity { [Column(IsPrimary true)] public long Id { get; set; } public string Name { get; set; } public DateTime CreateTime { get; set; } }业务模型层添加业务逻辑public class DeviceModel : INotifyPropertyChanged { private string _name; public string Name { get _name; set SetField(ref _name, value); } // 实现INotifyPropertyChanged... }映射转换层使用AutoMapper配置CreateMapDeviceEntity, DeviceModel() .ForMember(dest dest.Status, opt opt.MapFrom(src src.IsOnline ? 运行中 : 离线));4. 工业级Database层封装方案针对上位机项目特点我们设计了一套包含以下功能的完整封装核心功能模块多数据库支持读写分离分表分库审计日志性能监控关键实现代码public class DatabaseContext : IDisposable { private readonly IFreeSql _freeSql; public DatabaseContext(IFreeSql freeSql) { _freeSql freeSql; } public ISelectT QueryT() where T : class { return _freeSql.SelectT(); } public async TaskPageResultT PagedQueryAsyncT( int pageIndex, int pageSize, ExpressionFuncT, bool where null) where T : class { var select _freeSql.SelectT(); if (where ! null) select select.Where(where); long total 0; var data await select.Count(out total) .Page(pageIndex, pageSize) .ToListAsync(); return new PageResultT(data, total); } // 实现IDisposable... }性能优化建议批量操作使用InsertBatch替代循环单条插入复杂查询优先使用SQL语句而非Lambda高频访问数据考虑二级缓存定期监控慢查询日志5. 典型问题排查与解决方案问题1MVVM绑定不更新现象数据库更新后界面不刷新原因未正确触发PropertyChanged事件解决// 在Repository中手动触发 public async Task UpdateDevice(DeviceModel model) { await _freeSql.UpdateDeviceEntity() .SetSource(model.ToEntity()) .ExecuteAffrowsAsync(); model.RaisePropertyChanged(); // 显式通知 }问题2跨线程访问异常现象在非UI线程修改绑定属性报错解决Device.BeginInvoke(() { Status 已更新; });问题3连接池耗尽现象高并发时出现超时解决调整连接池参数{ ConnectionStrings: { MySQL: Server127.0.0.1;Poolingtrue;MinimumPoolSize10;MaximumPoolSize100; } }上位机开发中良好的数据访问架构能显著提升系统稳定性。建议在项目初期就建立规范的数据库访问规范避免后期大规模重构。对于工业场景特别要注意事务处理和异常恢复机制的健壮性设计。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2422738.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!