行业知识
C#中使用FreeSql进行数据库操作,并在WPF的MVVM模式下使用
2026-11-10 20:08:52
来源:互联网转载
在java转C#WPF上位���,MVVM过程中,遇到数据库的问题,经过简单的学习FreeSql语法糖,进行一下简单的封装及使用。
- 我们在C#项目中实现FreeSql技术,首先在我们需要在使用语法糖所在的文件下点击依懒性>管理NuGet程序包,搜索FreeSql并进行下载:
- 在appsettings.json配置文件中输入数据库连接配置,如果没有可在文件夹下自行创建,这里的连接的数据库是MYSQL和SQLServer的,不同的数据库连接的内容不一样。
{ "ConnectionStrings": { "mysql": "server=127.0.0.1;uid=root;pwd=admin;database=localtool;pooling=true;connectionlifetime=5;minpoolsize=1;maxpoolsize=500;" "Server Sql" = "localhost; Database = Session1; uid = sa; pwd = qwer; Trusted_Connection = False;" }}进行FreeSql的封装,注意文件名,我这边是复制的代码。
-
在我们下载FreeSql的文件夹下创建Database文件夹;
-
在Database文件夹下创建IFreeSqlDatabase.cs文件。
namespace XiaoDao.Database{ public interface IFreeSqlDatabase { IFreeSql FreeSql { get; } }}- 在Database文件下在创建FreeSqlDatabase.cs文件
namespace XiaoDao.Database{ public class FreeSqlDatabase : IFreeSqlDatabase { private IFreeSql freeSql; public FreeSqlDatabase(string connectionString) { freeSql = new FreeSqlBuilder().UseConnectionString(DataType.MySql, connectionString) .UseMonitorCommand(cmd => Console.WriteLine($"sql:{cmd.CommandText}")).UseAutoSyncStructure(true).Build(); } public IFreeSql FreeSql => freeSql; }}- 在创建与Database文件夹统计的interfaces和services文件夹
- 在interfaces创建IBaseDataService.cs文件
namespace XiaoDao.Database.interfaces{ public interface IBaseDataService { IEnumerable GetAll(); T Get(long id); T Get(string code); T Create(T entity); T Update(long id, T entity); T Update(string code, T entity); bool Delete(long id); bool Delete(string code); bool Delete(T entity); }}- 创建services文件夹下创建dataService.cs文件
namespace XiaoDao.Database.services{ public class DataService : IBaseDataService where T : DomainObject { private readonly IFreeSqlDatabase database; public DataService(IFreeSqlDatabase database){ this.database = database; } public virtual T Create(T entity) { if (entity.Id == 0) { entity.Id = Snowflake.Instance().GetId(); } entity.CreatedAt = DateTime.Now; entity.UpdatedAt = DateTime.Now; database.FreeSql.Insert(entity).ExecuteAffrows(); return entity; } public virtual bool Delete(long id) { database.FreeSql.Delete(new[] {id}).ExecuteAffrows(); return true; } public virtual bool Delete(string code) { database.FreeSql.Delete(new[] { code }).ExecuteAffrows(); return true; } public virtual bool Delete(T entity) { database.FreeSql.Delete(new[] { entity.Id }).ExecuteAffrows(); return true; } public virtual T Get(long id) { return database.FreeSql.Select().Where(a => a.Id == id).ToOne(); } public virtual T Get(string code) { return database.FreeSql.Select().Where(a => a.Code == code).ToOne(); } public virtual IEnumerable GetAll() { return database.FreeSql.Select().OrderByDescending(o => o.Id).ToList(); } public virtual T Update(long id, T entity) { Debug.WriteLine(database.FreeSql.Update().SetSource(entity).ToSql()); database.FreeSql.Update().SetSource(entity).ExecuteAffrows(); return entity; } public virtual T Update(string code, T entity) { Debug.WriteLine(database.FreeSql.Update().SetSource(entity).ToSql()); database.FreeSql.Update().SetSource(entity).ExecuteAffrows(); return entity; } }}在interfaces和services文件夹我们实现了对一些接口的封装,当然我们可以根据实体类自行定义接口进行继承此封装的接口。
接下来我们介绍一下如何在C#的WPF项目中MVVM模式下进行FreeSql操作。
我们需要根据数据库内容,创建实体类(model)、接口(interfaces)、和接口实现方法(services)。下面那我的举例,需要根据自己的进行修改。
- model类(注意与数据库中的字段对上,代码有所删减)
namespace XiaoDao.Domain.Models{ public class OperationData { [Column(IsPrimary = true)] public long Id { get; set; } public string Code { get; set; } [JsonIgnore] public DateTime? CreatedAt { get; set; } [JsonIgnore] public DateTime? UpdatedAt { get; set; } [JsonIgnore] public DateTime? DeletedAt { get; set; } [JsonIgnore] public string CreatedBy { get; set; } [JsonIgnore] public string UpdatedBy { get; set; } [JsonIgnore] public string DeleteedBy { get; set; } private int complteBolts; private int errorBolts; private int currentOperationBoltId; private int actionBolts; private string complteBoltCode; private string asyncStatus = "未同步"; private int _index; public int getIndex() { return _index; } public void setIndex(int index) { _index = index; } }}- 接口 这里继承了上面进行封装的类
namespace XiaoDao.Database.interfaces{ public interface IOperationDataDataService : IBaseDataService { IEnumerable GetPagedOperations(int pageIndex, int pageSize, out int pageCout); IEnumerable GetPageOpeartionsByType(int pageIndex, int pageSize, string operationByType, out int pageCount); OperationData GetLastestRecord(); IEnumerable GetPageOperationsByProcess(int pageIndex, int pageSize, string processNo, out int pageCount); IEnumerable GetPageOperationsByProject(int pageIndex, int pageSize, string projectNo, string processNo, int machineNo, out int pageCount); long GetDataStatus(); long GetDataStatusTreat(); }}- 接口实现
namespace XiaoDao.Database.services{ public class OperationDataDataService : DataService, IOperationDataDataService { private readonly IFreeSqlDatabase database; public OperationDataDataService(IFreeSqlDatabase database):base(database) { this.database = database; } public long GetDataStatus() { return database.FreeSql.Select().Where(p => p.AsyncStatus == "同步中").Count(); } public long GetDataStatusTreat() { return database.FreeSql.Select().Where(p => p.AsyncStatus == "待同步").Count(); } public OperationData GetLastestRecord() { var item = database.FreeSql.Select().OrderByDescending(d => d.CreatedAt).ToOne(); return item == null ? new OperationData() : item; } public IEnumerable GetPagedOperations(int pageIndex, int pageSize, out int pageCout) { long total = 0; var items = database.FreeSql.Select().OrderByDescending(d => d.StartDate).Count(out total).Page(pageIndex, pageSize).ToList(); pageCout = int.Parse(total.ToString()) / pageSize + 1; return items; } public IEnumerable GetPageOpeartionsByType(int pageIndex, int pageSize, string operationByType, out int pageCount) { long total = 0; var items = database.FreeSql.Select().Where(p => (p.OperationByType == operationByType) && (p.ComplteBolts > 0)).Count(out total).OrderByDescending(p => p.StartDate).Page(pageIndex, pageSize).ToList(); pageCount = int.Parse(total.ToString()) / pageSize + 1; return items; } public IEnumerable GetPageOperationsByProcess(int pageIndex, int pageSize, string processNo, out int pageCount) { long total = 0; var items = database.FreeSql.Select().Where(p => p.ProjectMachoneNo == 0 && p.ProductionProcessNo == processNo).OrderByDescending(p => p.UpdatedAt).Count(out total).Page(pageIndex, pageSize).ToList(); pageCount = int.Parse(total.ToString()) / pageSize + 1; return items; } public IEnumerable GetPageOperationsByProject(int pageIndex, int pageSize, string projectNo, string processNo, int machineNo, out int pageCount) { long total = 0; var query = database.FreeSql.Select().Where(p => p.ProductionProjectNo == projectNo); if (!string.IsNullOrEmpty(processNo)) { query.Where(p => p.ProductionProcessNo == processNo); } if(machineNo > 0) { query = query.Where(p => p.ProjectMachoneNo == machineNo); } var item = query.OrderByDescending(p => p.UpdatedAt).Page(pageIndex, pageSize).ToList(); pageCount = int.Parse(total.ToString()) / pageSize + 1; return item; } }}现在我们的接口和sql已经完毕,下面就到我们的MVVM进行调用。
在我们的所需要使用FreeSql的ViewMode文件里写上
private readonly IOperationDataDataService _operationDataDataService;
- 在VIewModel的主方法里写上引用。
方法参数里写上 IOperationDataDataService operationDataDataService,方法里进行引用 _operationDataDataService = operationDataDataService;
这时我们就可以使用FreeSql
注意我们接口里的参数。到此我们这篇文章结束。
欢迎留言和私信进行讨论!!
小白路漫漫,让我们一起加油!!!!
- 在VIewModel的主方法里写上引用。
- 接口实现
- 接口 这里继承了上面进行封装的类
- model类(注意与数据库中的字段对上,代码有所删减)
- 创建services文件夹下创建dataService.cs文件
- 在Database文件下在创建FreeSqlDatabase.cs文件
-