FreeSql (三)实体特性
主键(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 自定义特性
转载于:https://www.cnblogs.com/FreeSql/p/11531302.html
FreeSql (三)实体特性相关推荐
- FreeSql (四)实体特性 Fluent Api
FreeSql 提供使用 Fluent Api, 在外部配置实体的数据库特性,Fluent Api 的方法命名与特性名保持一致,如下: fsql.CodeFirst.ConfigEntity<T ...
- php开发面试题---php面向对象详解(对象的主要三个特性)
php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...
- css的三个特性 背景透明设置
关于行内元素(补充一点) 行内元素只能容纳文本或其他行内元素.(a特殊a里面可以放块级元素) 例子: 关于行高tip: 选择器的嵌套层级不应大于3级,位置靠后的限定条件应尽可能的精确. 属性定义必须另 ...
- CSS 的三个特性:层叠性、继承性、优先级
层叠性 CSS 有三个非常重要的三个特性:层叠性.继承性.优先级. 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式.层叠性主要解决样式冲突 的问题 层叠性原则: 样式冲突 ...
- 人对光波的三种特性_光线的三种特性——玩转光线的基础知识
摄影是用光的技术,想用好光线就必须了解光线的特性. 光线的三个特性就是: 1.强度.光的强度与光源的能量距离以及传播介质有关.直观的感觉就是光的明暗程度. 2.方向.就是光源的方向.但是在多光源或者漫 ...
- DDR4实战教学(三):特性与电气参数
微信搜索[每日硬知识],关注本公众号.网站访问链接:http://www.firesu.net. 好久未更,后续将陆续收尾DDR4博文系列.为大家带来DDR4的特性,DDR4的重要信号描述,DDR4的 ...
- 北京VI设计公司论VI设计的三个特性
北京VI设计公司论VI设计的三个特性 编辑:AGO(安可)品牌顾问 特性1:识别性 企业的VI设计应该让企业形象具有识别性,识别性是企业VI设计的重要功能之一.由于市场竞争不断加剧,各种VI商标符号更 ...
- 分布式CAP定理,为什么不能同时满足三个特性?
在弄清楚这个问题之前,我们先了解一下什么是分布式的CAP定理. 根据百度百科的定义,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性). Availability(可 ...
- 面向对象编程三种特性
文章目录 面向过程 面向过程特点 面向对象 面向对象特点 对象和类 定义类 类创建对象 封装特性 封装的特性 继承特性 多继承 新式类与经典类 私有属性与私有方法 私有属性和私有方法: 多态 多态特点 ...
最新文章
- asyncio.Protocol socket 断线重连
- python入门教程 官方-Python自学入门?
- 计算机外观类型,知道你的笔记本电脑是什么类型的吗?五大类型派对号入座
- idea JDK安装与配置
- php usort的用法,PHP usort()用法及代码示例
- Linux 命令行提示符路径显示
- 在Vista系统中,Flash渲染功能无法使用,咋办?
- Ubuntu 18.04 64位安装校园网客户端(完美解决)
- Keil MDK5解决error: L6002U: Could not open file …\obj\main.o: No such file or directory
- 酒店管理系统——界面设计
- 【CSS】对话框--禁止弹框/对话框蒙层下方内容滚动
- 【日语口语词典学习】第0002页
- 已是操作系统的一部分_什么是操作系统 第2部分
- jmeter 导入java,JMeter导入自定义的Jar包的详解教程
- Linux部署禅道在访问web页面进入www时报错:mysql无法连接(重新解压安装包或者输入命令:setenforce 0即可)
- unity 转盘记录
- CRM 窗体定制技巧和代码
- 网络安全职业规划(笔记)
- 哪有什么高效安全运行,只不过是磁盘之间在负重前行 Linux RAID磁盘阵列
- 防勒索病毒的核心——主机加固
热门文章
- java环境_配置java环境变量
- 【Python CheckiO 题解】Popular Words
- PWN-PRACTICE-BUUCTF-24
- PWN-PRACTICE-BUUCTF-8
- 【HDU - 2087】 剪花布条(直接模拟 or KMP)
- 11.深度学习练习:Keras tutorial - the Happy House(推荐)
- 4)机器学习基石笔记 Lecture4:Feasibility of Learning
- 在计算机应用中mis,在计算机的应用中,“MIS”表示
- raft算法mysql主从复制_Etcd raft算法实现原理分析
- Linux | 进程概念、进程状态(僵尸进程、孤儿进程、守护进程)、进程地址空间