class Topic { [Column(IsPrimary = true)] public int Id { get; set; } }
約定:html
當沒有指明主鍵時,命名爲 id 的字段將成爲主鍵;(不區分大小寫)sql
當主鍵是 Guid 類型時,插入時會自動建立(有序、不重複)的值,因此不須要本身賦值;(支持分佈式)數據庫
class Topic { [Column(IsIdentity = true)] public int Id { get; set; } }
約定:c#
[Index("uk_phone", "phone", true)] [Index("uk_group_index", "group,index", true)] [Index("uk_group_index22", "group, index22 desc", true)] class AddUniquesInfo { public Guid id { get; set; } public string phone { get; set; } public string group { get; set; } public int index { get; set; } public string index22 { get; set; } }
第三個參數 true 的時候是惟一鍵,false 的時候是普通索引。併發
class Topic { [Column(DbType = "varchar(128) NOT NULL")] public string Title { get; set; } }
能夠在類型上指定 NOT NULL,也能夠經過 [Column(IsNullable = false)] 設置;分佈式
0.9.12 版本增長了對 MaxLength 特性的解析,避免字符串經常使用時的麻煩,上面的 varchar(128) 可改寫成:ide
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; } }
class Topic { [Column(IsNullable = false)] public string Title { get; set; } }
在不指定 DbType、IsNullable 時,FreeSql 提供默認設定,如:ui
通常在使用 string 類型時,才須要手工指明是否可空(string 默承認空);this
class Topic { [Column(IsIgnore = true)] public string Title { get; set; } }
當實體有屬性不須要映射的時候使用,內部自動忽略了對象的映射;code
當實體內的屬性不是可接受的類型時,能夠不用指定該特定,以下沒必要要的指定:
class Topic { [Column(IsIgnore = true)] public Topic Parent { get; set; } }
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
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; } }
適用場景:當實體類繼承時,CodeFirst建立表的字段順序可能不是想要的,經過該特性能夠設置順序。
建立表時指定字段位置,如:[Column(Position = 1],可爲負數即反方向位置;
該字段是否能夠插入或更新,默認值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# 代碼內的註釋,遷移至數據庫的備註。先決條件:
一、實體類所在程序集,須要開啓 xml 文檔功能;
二、xml 文件必須與程序集同目錄,且文件名:xxx.dll -> xxx.xml;
(三)實體特性