FreeSql (三)实体特性
主鍵(Primary Key)
class Topic {[Column(IsPrimary = true)]public int Id { get; set; } }約定:
當(dāng)沒有指明主鍵時(shí),命名為 id 的字段將成為主鍵;(不區(qū)分大小寫)
當(dāng)主鍵是 Guid 類型時(shí),插入時(shí)會(huì)自動(dòng)創(chuàng)建(有序、不重復(fù))的值,所以不需要自己賦值;(支持分布式)
自增(Identity)
class Topic {[Column(IsIdentity = true)]public int Id { get; set; } }約定:
- 當(dāng)沒有指明主鍵時(shí),標(biāo)記自增的成員將成為主鍵;
唯一鍵(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; } }唯一鍵,在多個(gè)屬性指定相同的標(biāo)識(shí),代表聯(lián)合鍵;可使用逗號(hào)分割多個(gè) UniqueKey 名。
數(shù)據(jù)庫(kù)類型(DbType)
class Topic {[Column(DbType = "varchar(128) NOT NULL")]public string Title { get; set; } }可以在類型上指定 NOT NULL,也可以通過 [Column(IsNullable = false)] 設(shè)置;
0.9.12 版本增加了對(duì) MaxLength 特性的解析,避免字符串常用時(shí)的麻煩,上面的 varchar(128) 可改寫成:
class Topic {[MaxLength(128)]public string Title { get; set; } } 說明:由于內(nèi)部按名稱反射查找特性的,所以 MaxLengthAttribute 可以在任意地方定義。 該特性通常定義在 System.ComponentModel.DataAnnotations.MaxLengthAttribute。 如果找不到該類,可自行在項(xiàng)目中定義名稱為 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 時(shí),FreeSql 提供默認(rèn)設(shè)定,如:
- int -> not null(不可為空)
- int? -> null(可空)
一般在使用 string 類型時(shí),才需要手工指明是否可空(string 默認(rèn)可空);
忽略(Ignore)
class Topic {[Column(IsIgnore = true)]public string Title { get; set; } }當(dāng)實(shí)體有屬性不需要映射的時(shí)候使用,內(nèi)部自動(dòng)忽略了對(duì)象的映射;
當(dāng)實(shí)體內(nèi)的屬性不是可接受的類型時(shí),可以不用指定該特定,如下不必要的指定:
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; } }更新整個(gè)實(shí)體數(shù)據(jù)時(shí),在并發(fā)情況下極容易造成舊數(shù)據(jù)將新的記錄更新。
行級(jí)鎖的原理,是利用實(shí)體某字段,如:long version,更新前先查詢數(shù)據(jù),此時(shí) version 為 1,更新時(shí)產(chǎn)生的 SQL 會(huì)附加 where version = 1,當(dāng)修改失敗時(shí)(即 Affrows == 0)拋出異常。
每個(gè)實(shí)體只支持一個(gè)行級(jí)鎖屬性。
適用 SetSource 更新,無論使用什么方法更新 version 的值都會(huì)增加 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 { 中國(guó)人, abc, 香港 }應(yīng)該不需要解釋了吧?
BigInteger 都可以映射使用了,但請(qǐng)注意:僅僅是 CURD 方便, Equals == 判斷可以使用,無法實(shí)現(xiàn) + - * / 等操作;
v0.9.15 版本還可以將值對(duì)象映射成 typeof(string),安裝擴(kuò)展包:
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)
適用場(chǎng)景:當(dāng)實(shí)體類繼承時(shí),CodeFirst創(chuàng)建表的字段順序可能不是想要的,通過該特性可以設(shè)置順序。
創(chuàng)建表時(shí)指定字段位置,如:[Column(Position = 1],可為負(fù)數(shù)即反方向位置;
可插入(CanInsert)、可更新(CanUpdate)
該字段是否可以插入或更新,默認(rèn)值true,指定為false插入或更新時(shí)該字段會(huì)被忽略。
當(dāng)指明了 InsertColumn/UpdateColumns 等方法時(shí),該特性作用可能失效。例如 CanInsert = false 時(shí),又指明了 InsertColumns 該屬性,則仍然會(huì)插入。
名稱
FreeSql 默認(rèn)使用實(shí)體的類名,或?qū)傩悦c數(shù)據(jù)庫(kù)映射,也可以指定映射的名稱;
指定實(shí)體的表名,指定 Name 后,實(shí)體類名變化不影響數(shù)據(jù)庫(kù)對(duì)應(yīng)的表。FreeSql盡量支持了對(duì)多數(shù)據(jù)庫(kù)或schema支持,不防試試指定表名為:其他數(shù)據(jù)庫(kù).表名,不同數(shù)據(jù)庫(kù)的指定方式有差異,這一點(diǎn)以后深入解答。
[Table(Name = "db2.tb_topic111")] class Topic {//... }指定實(shí)體的表名,修改為實(shí)體類名。指定數(shù)據(jù)庫(kù)舊的表名,修改實(shí)體命名時(shí),同時(shí)設(shè)置此參數(shù)為修改之前的值,CodeFirst才可以正確修改數(shù)據(jù)庫(kù)表;否則將視為【創(chuàng)建新表】。
[Table(OldName = "Topic")] class Topic2 {//... }實(shí)體的屬性也有相同的功能,[Column(Name = "xxx")]
禁用遷移
IFreeSql.CodeFirst.IsAutoSyncStructure 可設(shè)置全局【自動(dòng)遷移結(jié)構(gòu)】功能,也可通過 FreeSqlBuilder.UseAutoSyncStructure(true) 創(chuàng)建 IFreeSql 的時(shí)候設(shè)置功能。
當(dāng)【實(shí)體類】對(duì)應(yīng)的是數(shù)據(jù)庫(kù)【視圖】或者其他時(shí),可通過 [Table(DisableSyncStructure = true)] 禁用指定的實(shí)體遷移操作。
[Table(DisableSyncStructure = true)] class ModelDisableSyncStructure {[Column(IsPrimary = false)]public int pkid { get; set; } }備注
FreeSql CodeFirst 支持將 c# 代碼內(nèi)的注釋,遷移至數(shù)據(jù)庫(kù)的備注。先決條件:
1、實(shí)體類所在程序集,需要開啟 xml 文檔功能;
2、xml 文件必須與程序集同目錄,且文件名:xxx.dll -> xxx.xml;
系列文章導(dǎo)航
(一)入門
(二)自動(dòng)遷移實(shí)體
(三)實(shí)體特性
(四)實(shí)體特性 Fluent Api
(五)插入數(shù)據(jù)
(六)批量插入數(shù)據(jù)
(七)插入數(shù)據(jù)時(shí)忽略列
(八)插入數(shù)據(jù)時(shí)指定列
(九)刪除數(shù)據(jù)
(十)更新數(shù)據(jù)
(十一)更新數(shù)據(jù) Where
(十二)更新數(shù)據(jù)時(shí)指定列
(十三)更新數(shù)據(jù)時(shí)忽略列
(十四)批量更新數(shù)據(jù)
(十五)查詢數(shù)據(jù)
(十六)分頁查詢
(十七)聯(lián)表查詢
(十八)導(dǎo)航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回?cái)?shù)據(jù)
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語法使用介紹
(二十五)延時(shí)加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語句,與實(shí)體類映射進(jìn)行二次查詢
(二十八)事務(wù)
(二十九)Lambda 表達(dá)式
(三十)讀寫分離
(三十一)分區(qū)分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說明
(三十五)CodeFirst 自定義特性
轉(zhuǎn)載于:https://www.cnblogs.com/FreeSql/p/11531302.html
總結(jié)
以上是生活随笔為你收集整理的FreeSql (三)实体特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二章:08运算符[比较运算符]
- 下一篇: iOS学习系列 - 扩展机制catego