CodeFirst 开发模式
传统的 ORM 框架都是 DatabaseFirst 的开发模式,也就是先设计好数据库,再编写实体的代码,并配置 ORM 框架中实体与数据库间的映射关系。由于要同时关心这三个不同内容,使得开发人员的工作量变得很大,开发效率低下。
在 Rafy 框架中,提倡开发人员采用 CodeFirst 的开发模式开发领域实体。即先编写领域实体的属性、关系的代码,然后由框架自动配置映射规则并生成目标数据库。这样的开发模式下,由于框架生成的数据库满足第三范式,使得开发人员通常都不用关心数据库结构及映射,大大提高开发效率。
框架的数据库同步模块,不但支持一次性生成完整的数据库,更重要的是支持渐近式更新数据库,会自动把实体上的变更实时同步到目标数据库上。例如,当为实体添加一个新的属性后,框架会为对应的表添加新的列,而不会删除历史表及数据。
优势:
- 这种方式和敏捷开发的模式非常相似,可以不用一次性把实体类设计完整,而是随着对需求的理解越来越深刻,再逐步地完善实体类、数据库。
- 这也使得拥抱变化万能可能。软件开发过程中,需求变化时,数据库字段也经常会发生变化。而使用渐近式开发模式后,任何时候都可以随意地添加新的字段、删除旧的字段,而不会影响其它数据。
使用方法
要打开数据库同步功能,我们需要在领域插件类型中使用领域服务 MigrateService 来实现。以下代码在 JXC 领域插件中,开启了 JXC 数据库自动同步的功能:
public class JXCPlugin : DomainPlugin
{
public override void Initialize(IApp app)
{
//在应用程序运行时启动时,才升级数据库。
app.RuntimeStarting += (o, e) => AutoUpdateDb();
}
/// <summary>
/// 自动升级数据库。
/// </summary>
private static void AutoUpdateDb()
{
var svc = ServiceFactory.Create<MigrateService>();
svc.Options = new MigratingOptions
{
//ReserveHistory = true,//ReserveHistory 表示是否需要保存所有数据库升级的历史记录
//RunDataLossOperation = DataLossOperation.All,//要支持数据库表、字段的删除操作,取消本行注释。
Databases = new string[] { JXCEntityRepository.DbSettingName }
};
svc.Invoke();
}
}
使用时,需要注意以下几点:
- 自动同步数据库的代码,需要在应用程序运行时生成周期开始时执行。这时,应用程序中所有实体的属性已经初始化完成,才能同步出正确的数据库。
- 默认没有开启日志记录功能,可以设置 ReserveHistory = true 来记录所有数据库同步日志。 打开日志记录功能后,框架会自动生成一个专门用于存储日志的数据库,该库可通过 DbMigrationHistory 连接字符串配置名进行配置。
- 默认不会执行所有会造成数据丢失的操作(删除列、删除表),要执行删除操作,需要设置 RunDataLossOperation 属性。
高级
如果期望更细粒度地控制数据库同步功能,可以使用 RafyDbMigrationContext 类型来完成。