今天看到一篇博文EntityFramework Core如何映射動態模型? ,文章講的是如何用EF動態創建表的問題,比如根據時間動態創建一個表,這種場景常出現在應用系統的日志記錄功能中,原文用EF實作非常復雜,相比而言,SOD框架就要簡單很多,
下面直接給出SOD框架的方案,
public class User : EntityBase { public User() { TableName="Tb_User"; IdentityName = "UserID"; PrimaryKeys.Add("UserID"); } /// <summary> /// 設定欄位名陣列,如果不實作該方法,框架會自動反射獲取到欄位名陣列,因此從效率考慮,建議實作該方法 /// </summary> protected override void SetFieldNames() { PropertyNames = new string[] { "UserID", "Name", "Pwd", "RegistedDate" }; } public int ID { get { return getProperty<int>("UserID"); } set { setProperty("UserID", value); } } public string Name { get { return getProperty<string>("Name"); } set { setProperty("Name", value, 50); } } public string Pwd { get { return getProperty<string>("Pwd"); } set { setProperty("Pwd", value, 50); } } public DateTime RegistedDate { get { return getProperty<DateTime>("RegistedDate"); } set { setProperty("RegistedDate", value); } } //重寫 GetTableName,實作分表方法 public override string GetTableName() { if (this.ID < 1000) return "Users"; else if (this.ID < 2000) return "1000"; //分表 else Schema = "DbPart1].[dbo"; //指定架構分庫 return "Users2000"; } } public class LocalDbContext : DbContext { public LocalDbContext() : base("local") { //local 是App.config/Web.config 組態檔連接字串的名字 //在命令管道中注冊日志處理器和Oracle命令處理器 //base.CurrentDataBase.RegisterCommandHandle(new CommandExecuteLogHandle()); //base.CurrentDataBase.RegisterCommandHandle(new OracleCommandHandle()); } #region 父類抽象方法的實作 protected override bool CheckAllTableExists() { //創建用戶表 //CheckTableExists<User>(); //用下面的方式可以做些表創建后的初始化 //InitializeTable<User>("insert into {0}([Name],[Pwd]) values 'Admin','888888')"); User user= new User(); user.ID=1500; //將使用磁區表 //根據物體類的表磁區函式,動態檢查和創建表 CheckTableExists<User>(user); return true; } #endregion }
如上面的示例,在CheckAllTableExists 方法中使用物體類實體來檢查和創建表,這樣就可以實作動態創建表了,
關于如何動態查詢表,可以參考《SOD框架“企業級”應用資料架構實戰》一書的【6.9.6SOD 框架分庫分表】,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/254232.html
標籤:C#
