我分享一个简单的WebFirst代码生成脚本
这个脚本只对WebFirst有用。
WebFirst是一个工厂,代码工厂。
Entity 实体生成
对于 CRUD来说只需要配置主键和自增列就行了 ,如果类的名称和数据库不一样可以设置数据库中的名称
using System;
using System.Collections.Generic;
using System.Linq;
using SqlSugar;
namespace @Model.name_space
{
/// <summary>
/// @((Model.Description+"").Replace("\r","").Replace("\n",""))
///@(DateTime.Now.ToString("yyyy年MM月dd日 "))【ZXM】
///</summary>
[SugarTable("@(Model.TableName)")]
public class @(Model.ClassName)
{
@foreach (var item in Model.PropertyGens)
{
var isPrimaryKey = item.IsPrimaryKey ? ",IsPrimaryKey = true" : "";
var isIdentity = item.IsIdentity ? ",IsIdentity = true" : "";
var isNull=(item.IsNullable&&item.Type!="string"&&item.IsSpecialType==false&&item.Type!="byte[]")?"?":"";
var isIgnore=(item.IsIgnore?",IsIgnore = true":"");
var isJson=(item.CodeType.StartsWith("json")?",IsJson= true":"");
var newPropertyName=item.PropertyName; //这里可以用C#处理 实体属性的显式格式
//想和数据库一样就用 newPropertyName=item.DbColumnName
if(System.Text.RegularExpressions.Regex.IsMatch(newPropertyName.Substring(0,1), "[0-9]"))
{
newPropertyName="_"+newPropertyName;//处理属性名开头为数字情况
}
if(newPropertyName==Model.ClassName)
{
newPropertyName="_"+newPropertyName;//处理属性名不能等于类名
}
var desc=(item.Description+"").Replace("\r","").Replace("\n","");//处理换行
if(isIgnore!="")
{
isPrimaryKey =isIdentity =isNull="";
}
@:/// <summary>
@:/// @(desc)
@if(item.DefaultValue!=null)
{
@:/// 默认值: @Raw(item.DefaultValue)
}
@:///</summary>
@: [SugarColumn(ColumnName="@item.DbColumnName" @(isPrimaryKey) @(isIdentity) @(isIgnore) @(isJson))]
@: public @Raw(item.Type)@isNull @newPropertyName { get; set; }
}
}
}
IRepository接口类和Repository实现类生成
在典型的三层架构中,Repository通常作为数据访问层(Data Access Layer)的一部分存在,负责处理数据访问的细节。下面是一些Repository的特点:
数据访问:Repository的主要职责是封装底层的数据访问操作,例如CRUD(创建、读取、更新、删除)操作。它提供了数据查询、添加、修改、删除等方法供其他层使用。
抽象封装:Repository通过提供数据操作的接口或抽象类,将数据访问细节隐藏在后台,为上层提供统一的接口,使得业务逻辑层能够以更高层次的抽象来调用和操作数据。
单一职责原则:Repository遵循单一职责原则,将数据访问操作与业务逻辑分离,确保了代码的可维护性和可测试性。
可测试性:由于Repository将数据访问操作进行了封装和抽象,因此可以更方便地进行单元测试,而不需要依赖实际的数据存储。
可扩展性:通过Repository模式,可以轻松地切换或扩展底层数据存储,比如从关系型数据库切换到非关系型数据库。由于上层代码只依赖于Repository接口,而不是具体的实现,所以可以更容易地修改或替换底层实现。
/// <summary>
/// @((Model.Description+"").Replace("\r","").Replace("\n",""))
///@(DateTime.Now.ToString("yyyy年MM月dd日 "))【ZXM】
///</summary>
public interface I@(Model.ClassName)Repository : IBaseRepository<@(Model.ClassName)>
{
Task<Object> AddModel(@(Model.ClassName) model);/*添加实体*/
Task<Object> GetPageList(search@(Model.ClassName) s);/*分页条件查询*/
Task<Object> GetById(int id);/*根据id获取实体*/
Task<Object> UpdateModel(@(Model.ClassName) model);/*更新实体*/
}
/// <summary>
/// @((Model.Description+"").Replace("\r","").Replace("\n",""))
/// @(DateTime.Now.ToString("yyyy年MM月dd日 "))【ZXM】
///</summary>
public class @(Model.ClassName)Repository : BaseRepository<@(Model.ClassName)>, I@(Model.ClassName)Repository
{
public @(Model.ClassName)Repository()
{
}
public async Task<Object> AddModel(@(Model.ClassName) model)
{
MessageModel<@(Model.ClassName)> message = new MessageModel<@(Model.ClassName)>
{
code = 200,
msg = "添加成功"
};
try
{
var resId = await Db.Insertable(model).ExecuteReturnBigIdentityAsync();
var resModel=await Db.Queryable<@(Model.ClassName)>().SingleAsync(it=>it.Id==resId);
message.data=resModel;
}
catch(Exception ex)
{
message.code = 500;
message.msg = "请求错误"+ex.Message;
}
return message;
}
public async Task<Object> UpdateModel(@(Model.ClassName) model)
{
var message = new MessageModel<@(Model.ClassName)>()
{
msg = "修改成功",
code = 200
};
try{
var resModel = await Db.Queryable<@(Model.ClassName)>()
.Where(it => it.Id == model.Id).FirstAsync();
if (resModel != null)
{
var resInt = await Db.Updateable(model).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
message.data = await Db.Queryable<@(Model.ClassName)>()
.Where(it => it.Id == model.Id).FirstAsync();;
}
else