在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<T>
    {
        IEnumerable<T> 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<T> : IBaseDataService<T> 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<T>(new[] {id}).ExecuteAffrows();
            return true;
        }

        public virtual bool Delete(string code)
        {
            database.FreeSql.Delete<T>(new[] { code }).ExecuteAffrows();
            return true;
        }
        public virtual bool Delete(T entity)
        {
            database.FreeSql.Delete<T>(new[] { entity.Id }).ExecuteAffrows();
            return true;
        }

        public virtual T Get(long id)
        {
            return database.FreeSql.Select<T>().Where(a => a.Id == id).ToOne();
        }
        public virtual T Get(string code)
        {
            return database.FreeSql.Select<T>().Where(a => a.Code == code).ToOne();
        }

        public virtual IEnumerable<T> GetAll()
        {
            return database.FreeSql.Select<T>().OrderByDescending(o => o.Id).ToList();
        }


        public virtual T Update(long id, T entity)
        {
            Debug.WriteLine(database.FreeSql.Update<T>().SetSource(entity).ToSql());
            database.FreeSql.Update<T>().SetSource(entity).ExecuteAffrows();
            return entity;
        }
        public virtual T Update(string code, T entity)
        {
            Debug.WriteLine(database.FreeSql.Update<T>().SetSource(entity).ToSql());
            database.FreeSql.Update<T>().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<OperationData>
    {
        IEnumerable<OperationData> GetPagedOperations(int pageIndex, int pageSize, out int pageCout);
        IEnumerable<OperationData> GetPageOpeartionsByType(int pageIndex, int pageSize, string operationByType, out int pageCount);
        OperationData GetLastestRecord();
        IEnumerable<OperationData> GetPageOperationsByProcess(int pageIndex, int pageSize, string processNo, out int pageCount);
        IEnumerable<OperationData> 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<OperationData>, IOperationDataDataService
    {
        private readonly IFreeSqlDatabase database;

        public OperationDataDataService(IFreeSqlDatabase database):base(database)
        {
            this.database = database;
        }

        public long GetDataStatus()
        {
            return database.FreeSql.Select<OperationData>().Where(p => p.AsyncStatus == "同步中").Count();
        }
        public long GetDataStatusTreat()
        {
            return database.FreeSql.Select<OperationData>().Where(p => p.AsyncStatus == "待同步").Count();
        }

        public OperationData GetLastestRecord()
        {
            var item = database.FreeSql.Select<OperationData>().OrderByDescending(d => d.CreatedAt).ToOne();
            return item == null ? new OperationData() : item;
        }

        public IEnumerable<OperationData> GetPagedOperations(int pageIndex, int pageSize, out int pageCout)
        {
            long total = 0;
            var items = database.FreeSql.Select<OperationData>().OrderByDescending(d => d.StartDate).Count(out total).Page(pageIndex, pageSize).ToList();
            pageCout = int.Parse(total.ToString()) / pageSize + 1;
            return items;
        }

        public IEnumerable<OperationData> GetPageOpeartionsByType(int pageIndex, int pageSize, string operationByType, out int pageCount)
        {
            long total = 0;
            var items = database.FreeSql.Select<OperationData>().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<OperationData> GetPageOperationsByProcess(int pageIndex, int pageSize, string processNo, out int pageCount)
        {
            long total = 0;
            var items = database.FreeSql.Select<OperationData>().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<OperationData> GetPageOperationsByProject(int pageIndex, int pageSize, string projectNo, string processNo, int machineNo, out int pageCount)
        {
            long total = 0;
            var query = database.FreeSql.Select<OperationData>().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
在这里插入图片描述
注意我们接口里的参数。到此我们这篇文章结束。
欢迎留言和私信进行讨论!!
小白路漫漫,让我们一起加油!!!!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐