FreeSql 支持 CodeFirst 迁移结构至数据库,这应该是(O/RM)必须标配的一个功能。
与其他(O/RM)不同FreeSql支持更多的数据库特性,而不只是支持基础的数据类型,这既是优点也是缺点,优点是充分利用数据库特性辅助开发,缺点是切换数据库变得困难。不同程序员的理念可能不太一致,作为功能库FreeSql支持到了极致,至于是否使用是项目组技术衡量的另一个问题。
尽管多种数据库适配逻辑非常复杂,FreeSql始终秉承优化程序开发习惯的原则尽量去实现,中间碰到了一些非技术无法攻克的难题,比如数据库的自定义类型,和实体类本身就是一种冲突,为了减少使用成本,诸如此类的数据库功能没有得到支持。
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
.UseAutoSyncStructure(true) //自动同步实体结构【开发环境必备】
.Build();
《实体特性说明》
《FluentApi,享受纯净实体类》
《导入数据库特性,懒人专利》
《Aop自定义特性,与其他 ORM 共用特性》
《类型映射,一览便知》
《导航关系配置》
迁移结构
实体&表对比 | 添加 | 改名 | 删除 |
---|---|---|---|
√ | √ | X |
实体属性&字段对比 | 添加 | 修改可空 | 修改自增 | 修改类型 | 改名 | 删除 | 备注 |
---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | X | √ |
为了保证安全,不提供删除字段。
警告:如果实体类属性,与数据库表字段不完整映射的时候,未映射的字段有可能发生丢失。
原因:某些迁移对比操作是:创建临时表、导入旧表数据、删除旧表。
FreeSql提供两种CodeFirst移迁方法,自动和手动。
自动同步实体结构【开发环境必备】
自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后迁移执行创建或修改。
fsql.CodeFirst.IsAutoSyncDataStructure = true;
此功能默认为开启状态,发布正式环境后,请修改此设置。
虽然【自动同步实体结构】功能开发非常好用,但是有个坏处,就是数据库后面会很乱,没用的字段可能一大堆,应尽量控制实体或属性命名的修改。
禁用迁移
当【实体类】对应的是数据库【视图】或者其他时,可通过 [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;
手工同步实体结构
提供接口方法实现对比实体,与数据库中的变化部分,返回SQL语句。
var t1 = mysql.CodeFirst.GetComparisonDDLStatements();
class Topic {
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
public ushort fusho { get; set; }
}
CREATE TABLE IF NOT EXISTS `cccddd`.`Topic` (
`Id` INT(11) NOT NULL AUTO_INCREMENT,
`Clicks` INT(11) NOT NULL,
`Title` VARCHAR(255),
`CreateTime` DATETIME NOT NULL,
`fusho` SMALLINT(5) UNSIGNED NOT NULL,
PRIMARY KEY (`Id`)
) Engine=InnoDB CHARACTER SET utf8;
提供接口方法实现同步结构
var t2 = fsql.CodeFirst.SyncStructure();
//同步实体类型到数据库
实体特性
指定实体的表名,指定 Name 后,实体类名变化不影响数据库对应的表。FreeSql尽量支持了对多数据库或schema支持,不防试试指定表名为:其他数据库.表名,不同数据库的指定方式有差异,这一点以后深入解答。
[Table(Name = "db2.tb_topic111")]
class Topic {
//...
}
无指定实体的表名,修改为实体类名。指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】。
[Table(OldName = "Topic")]
class Topic2 {
//...
}
ALTER TABLE `cccddd`.`Topic` RENAME TO `cccddd`.`Topic2`;
修改字段类型,把 Title 类型改为 varchar(128)。
[Column(DbType = "varchar(128)")]
public string Title { get; set; }
ALTER TABLE `cccddd`.`Topic2` MODIFY `Title` VARCHAR(128);
指定属性的字段名,这样指定后,修改实体的属性名不影响数据库对应的列。
[Column(Name = "titl2")]
public string Title { get; set; }
无指定属性的字段名,修改为属性名,指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】。
[Column(OldName = "Title2")]
public string Title { get; set; }
ALTER TABLE `cccddd`.`Topic2` CHANGE COLUMN `Title2` `Title` VARCHAR(255);
系列文章导航
(一)入门
(二)自动迁移实体
(三)实体特性
(四)实体特性 Fluent Api
(五)插入数据
(六)批量插入数据
(七)插入数据时忽略列
(八)插入数据时指定列
(九)删除数据
(十)更新数据
(十一)更新数据 Where
(十二)更新数据时指定列
(十三)更新数据时忽略列
(十四)批量更新数据
(十五)查询数据
(十六)分页查询
(十七)联表查询
(十八)导航属性
(十九)多表查询
(二十)多表查询 WhereCascade
(二十一)查询返回数据
(二十二)Dto 映射查询
(二十三)分组、聚合
(二十四)Linq To Sql 语法使用介绍
(二十五)延时加载
(二十六)贪婪加载 Include、IncludeMany、Dto、ToList
(二十七)将已写好的 SQL 语句,与实体类映射进行二次查询
(二十八)事务
(二十九)Lambda 表达式
(三十)读写分离
(三十一)分区分表
(三十二)Aop
(三十三)CodeFirst 类型映射
(三十四)CodeFirst 迁移说明
(三十五)CodeFirst 自定义特性