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;

系列文章导航