FreeSql (三)實體特性

主鍵(Primary Key)

class Topic {
    [Column(IsPrimary = true)]
    public int Id { get; set; }
}

約定:html

  • 當沒有指明主鍵時,命名爲 id 的字段將成爲主鍵;(不區分大小寫)sql

  • 當主鍵是 Guid 類型時,插入時會自動建立(有序、不重複)的值,因此不須要本身賦值;(支持分佈式)數據庫

自增(Identity)

class Topic {
    [Column(IsIdentity = true)]
    public int Id { get; set; }
}

約定:c#

  • 當沒有指明主鍵時,標記自增的成員將成爲主鍵;

惟一鍵(Unique Key)、索引(Index)

[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 的時候是普通索引。併發

數據庫類型(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) 可改寫成: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;
    }
}

可空(Nullable)

class Topic {
    [Column(IsNullable = false)]
    public string Title { get; set; }
}

在不指定 DbType、IsNullable 時,FreeSql 提供默認設定,如:ui

  • int -> not null(不可爲空)
  • int? -> null(可空)

通常在使用 string 類型時,才須要手工指明是否可空(string 默承認空);this

忽略(Ignore)

class Topic {
    [Column(IsIgnore = true)]
    public string Title { get; set; }
}

當實體有屬性不須要映射的時候使用,內部自動忽略了對象的映射;code

當實體內的屬性不是可接受的類型時,能夠不用指定該特定,以下沒必要要的指定:

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# 代碼內的註釋,遷移至數據庫的備註。先決條件:

一、實體類所在程序集,須要開啓 xml 文檔功能;

二、xml 文件必須與程序集同目錄,且文件名:xxx.dll -> xxx.xml;

系列文章導航

相關文章
相關標籤/搜索