主鍵(Primary Key)
class Topic {[Column(IsPrimary = true)]public int Id { get; set; }
}
約定:
當沒有指明主鍵時,命名為 id 的字段將成為主鍵;(不區分大小寫)
當主鍵是 Guid 類型時,插入時會自動創建(有序、不重復)的值,所以不需要自己賦值;(支持分布式)
自增(Identity)
class Topic {[Column(IsIdentity = true)]public int Id { get; set; }
}
約定:
- 當沒有指明主鍵時,標記自增的成員將成為主鍵;
唯一鍵(Unique Key)
class AddUniquesInfo {public Guid id { get; set; }[Column(Unique = "uk_phone")]public string phone { get; set; }[Column(Unique = "uk_group_index, uk_group_index22")]public string group { get; set; }[Column(Unique = "uk_group_index")]public int index { get; set; }[Column(Unique = "uk_group_index22")]public string index22 { get; set; }
}
唯一鍵,在多個屬性指定相同的標識,代表聯合鍵;可使用逗號分割多個 UniqueKey 名。
數據庫類型(DbType)
class Topic {[Column(DbType = "varchar(128) NOT NULL")]public string Title { get; set; }
}
可以在類型上指定 NOT NULL,也可以通過 [Column(IsNullable = false)] 設置;
0.9.12 版本增加了對 MaxLength 特性的解析,避免字符串常用時的麻煩,上面的 varchar(128) 可改寫成:
class Topic {[MaxLength(128)]public string Title { get; set; }
}
說明:由于內部按名稱反射查找特性的,所以 MaxLengthAttribute 可以在任意地方定義。
該特性通常定義在 System.ComponentModel.DataAnnotations.MaxLengthAttribute。
如果找不到該類,可自行在項目中定義名稱為 MaxLengthAttribute 的特性類,如下:public class MaxLengthAttribute : Attribute
{public int Length { get; }public MaxLengthAttribute(int length){this.Length = length;}
}
可空(Nullable)
class Topic {[Column(IsNullable = false)]public string Title { get; set; }
}
在不指定 DbType、IsNullable 時,FreeSql 提供默認設定,如:
- int -> not null(不可為空)
- int? -> null(可空)
一般在使用 string 類型時,才需要手工指明是否可空(string 默認可空);
忽略(Ignore)
class Topic {[Column(IsIgnore = true)]public string Title { get; set; }
}
當實體有屬性不需要映射的時候使用,內部自動忽略了對象的映射;
當實體內的屬性不是可接受的類型時,可以不用指定該特定,如下不必要的指定:
class Topic {[Column(IsIgnore = true)]public Topic Parent { get; set; }
}
樂觀鎖(RowVersion)
class Topic {public Guid id { get; set; }public string Title { get; set; }[Column(IsVersion = true)]public int Version { get; set; }
}
更新整個實體數據時,在并發情況下極容易造成舊數據將新的記錄更新。
行級鎖的原理,是利用實體某字段,如:long version,更新前先查詢數據,此時 version 為 1,更新時產生的 SQL 會附加 where version = 1,當修改失敗時(即 Affrows == 0)拋出異常。
每個實體只支持一個行級鎖屬性。
適用 SetSource 更新,無論使用什么方法更新 version 的值都會增加 1
自定義類型映射(MapType)
class EnumTestMap {public Guid id { get; set; }[Column(MapType = typeof(string))]public ToStringMapEnum enum_to_string { get; set; }[Column(MapType = typeof(string))]public ToStringMapEnum? enumnullable_to_string { get; set; }[Column(MapType = typeof(int))]public ToStringMapEnum enum_to_int { get; set; }[Column(MapType = typeof(int?))]public ToStringMapEnum? enumnullable_to_int { get; set; }[Column(MapType = typeof(string))]public BigInteger biginteger_to_string { get; set; }[Column(MapType = typeof(string))]public BigInteger? bigintegernullable_to_string { get; set; }
}
public enum ToStringMapEnum { 中國人, abc, 香港 }
應該不需要解釋了吧?
BigInteger 都可以映射使用了,但請注意:僅僅是 CURD 方便, Equals == 判斷可以使用,無法實現 + - * / 等操作;
v0.9.15 版本還可以將值對象映射成 typeof(string),安裝擴展包:
dotnet add package FreeSql.Extensions.JsonMap
fsql.UseJsonMap(); //開啟功能class TestConfig
{public int clicks { get; set; }public string title { get; set; }
}
[Table(Name = "sysconfig")]
public class S_SysConfig<T>
{[Column(IsPrimary = true)]public string Name { get; set; }[JsonMap]public T Config { get; set; }
}
字段位置(Position)
適用場景:當實體類繼承時,CodeFirst創建表的字段順序可能不是想要的,通過該特性可以設置順序。
創建表時指定字段位置,如:[Column(Position = 1],可為負數即反方向位置;
可插入(CanInsert)、可更新(CanUpdate)
該字段是否可以插入或更新,默認值true,指定為false插入或更新時該字段會被忽略。
當指明了 InsertColumn/UpdateColumns 等方法時,該特性作用可能失效。例如 CanInsert = false 時,又指明了 InsertColumns 該屬性,則仍然會插入。
名稱
FreeSql 默認使用實體的類名,或屬性名與數據庫映射,也可以指定映射的名稱;
指定實體的表名,指定 Name 后,實體類名變化不影響數據庫對應的表。FreeSql盡量支持了對多數據庫或schema支持,不防試試指定表名為:其他數據庫.表名,不同數據庫的指定方式有差異,這一點以后深入解答。
[Table(Name = "db2.tb_topic111")]
class Topic {//...
}
指定實體的表名,修改為實體類名。指定數據庫舊的表名,修改實體命名時,同時設置此參數為修改之前的值,CodeFirst才可以正確修改數據庫表;否則將視為【創建新表】。
[Table(OldName = "Topic")]
class Topic2 {//...
}
實體的屬性也有相同的功能,[Column(Name = "xxx")]
禁用遷移
IFreeSql.CodeFirst.IsAutoSyncStructure 可設置全局【自動遷移結構】功能,也可通過 FreeSqlBuilder.UseAutoSyncStructure(true) 創建 IFreeSql 的時候設置功能。
當【實體類】對應的是數據庫【視圖】或者其他時,可通過 [Table(DisableSyncStructure = true)] 禁用指定的實體遷移操作。
[Table(DisableSyncStructure = true)]
class ModelDisableSyncStructure {[Column(IsPrimary = false)]public int pkid { get; set; }
}
備注
FreeSql CodeFirst 支持將 c# 代碼內的注釋,遷移至數據庫的備注。先決條件:
1、實體類所在程序集,需要開啟 xml 文檔功能;
2、xml 文件必須與程序集同目錄,且文件名:xxx.dll -> xxx.xml;
系列文章導航
(一)入門
(二)自動遷移實體
(三)實體特性
(四)實體特性 Fluent Api
(五)插入數據
(六)批量插入數據
(七)插入數據時忽略列
(八)插入數據時指定列
(九)刪除數據
(十)更新數據
(十一)更新數據 Where
(十二)更新數據時指定列
(十三)更新數據時忽略列
(十四)批量更新數據
(十五)查詢數據
(十六)分頁查詢
(十七)聯表查詢
(十八)導航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回數據
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實體類映射進行二次查詢
(二十八)事務
(二十九)Lambda 表達式
(三十)讀寫分離
(三十一)分區分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性