[分享] 一款極簡單的 BaseEntity CRUD 方法
前言
嘗試過 ado.net、dapper、ef,以及Repository倉儲,甚至自己還寫過生成器工具,以便做常規CRUD操作。
它們日常操作不方便之處:
每次使用前需要宣告,再操作;
很多人一個實體類,對應一個操作類(或DAL、DbContext、Repository);
BaseEntity 是一種極簡單的 CodeFirst 開發方式,特別對單表或多表CRUD,利用繼承節省了每個實體類的重複屬性(建立時間、ID等欄位),軟體刪除等功能,進行 crud 操作時不必時常考慮倉儲的使用;
本文介紹 BaseEntity 一種極簡約的 CRUD 操作方法。
功能特點
自動遷移實體結構(CodeFirst),到資料庫;
直接操作實體的方法,進行 CRUD 操作;
簡化使用者定義實體型別,省去主鍵、常用欄位的配置(如CreateTime、UpdateTime);
實現單表、多表查詢的軟刪除邏輯;
宣告
示範專案:https://github.com/2881099/FreeSql/tree/master/Examples/base_entity
參考 BaseEntity.cs 原始碼(約100行),拷貝專案中使用,然後新增 nuget 引用包:
dotnet add package FreeSql.Repository
dotnet add package FreeSql.Provider.Sqlite
1、定義一個主鍵 int 並且自增的實體型別,BaseEntity TKey 指定為 int/long 時,會認為主鍵是自增;
public class UserGroup : BaseEntity<UserGroup, int>
{
public string GroupName { get; set; }
}
如果不想主鍵是自增鍵,可以重寫屬性:
public class UserGroup : BaseEntity<UserGroup, int> { [Column(IsIdentity = false)] public override int Id { get; set; } public string GroupName { get; set; } }
有關更多實體的特性配置,請參考資料:https://github.com/2881099/FreeSql/wiki/%e5%ae%9e%e4%bd%93%e7%89%b9%e6%80%a7
2、定義一個主鍵 Guid 的實體型別,儲存資料時會自動產生有序不重複的 Guid 值(不用自己指定 Guid.NewGuid());
public class User : BaseEntity<UserGroup, Guid>
{
public string UserName { get; set; }
}
3、定義多主鍵的實體型別,可以在 static 建構函式中重寫欄位名;
public class User2 : BaseEntity<User2, Guid, int>
{
static User2()
{
User2.Orm.CodeFirst.ConfigEntity<User2>(t =>
{
t.Property(a => a.PkId1).Name("UserId");
t.Property(a => a.PkId2).Name("Index");
});
}
public string Username { get; set; }
}
CRUD 使用
//新增
var item = new UserGroup { GroupName = "組一" };
item.Insert();
//更新
item.GroupName = "組二";
item.Update();
//新增或更新
item.Save();
//軟刪除
item.Delete();
//恢復軟刪除
item.Restore();
//根據主鍵獲取物件
var item = UserGroup.Find(1);
//查詢資料
var items = UserGroup.Where(a => a.Id > 10).ToList();
實體型別.Select 是一個查詢物件,使用方法和 FreeSql.ISelect 一樣;
支援多表查詢時,軟刪除條件會附加在每個表中;
有關更多查詢方法,請參考資料:https://github.com/2881099/FreeSql/wiki/%e6%9f%a5%e8%af%a2