C#中使用FreeSql进行数据库操作,并在WPF的MVVM模式下使用
我们需要根据数据库内容,创建实体类(model)、接口(interfaces)、和接口实现方法(services)。在interfaces和services文件夹我们实现了对一些接口的封装,当然我们可以根据实体类自行定义接口进行继承此封装的接口。在java转C#WPF上位机,MVVM过程中,遇到数据库的问题,经过简单的学习FreeSql语法糖,进行一下简单的封装及使用。现在我们的接口和sql已经完
·
在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
注意我们接口里的参数。到此我们这篇文章结束。
欢迎留言和私信进行讨论!!
小白路漫漫,让我们一起加油!!!!
更多推荐
已为社区贡献2条内容
所有评论(0)