小工具知识网

当前位置: 首页 > 行业知识 > C#中使用FreeSql进行数据库操作,并在WPF的MVVM模式下使用

行业知识

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

                    注意我们接口里的参数。到此我们这篇文章结束。

                    欢迎留言和私信进行讨论!!

                    小白路漫漫,让我们一起加油!!!!

上一篇:WP Statistics使用秘籍,轻松驾驭数据分析利器!

下一篇:基于LIDC-IDRI肺结节肺癌数据集的放射组学机器学习分类良性和恶性肺癌(Python 全代码)全流程解析 (一)