XAF EFCore 示例
前言
在DEV官方建议创建新的XAF项目推荐选择EFCore时,我也第一时间创建了XAF的EFCore项目,这也是我第一次创建这个类型的项目,之前一直使用XPO,避免不了要对比一下。如果熟悉XPO但不了解EFCore的小伙伴来说,会有些迷茫,再加上通过向导创建的项目并不是开箱即用,还需要进行配置,可能会打击想了解EFCore小伙伴的积极性,下面我会简单的讲解一下XAFEFCore项目创建及配置的过程。示例项目放到了gitee中,https://gitee.com/easyxaf/xaf_efcore_sample
创建
创建的过程比较简单,与XPO版本的一样,甚至在22.5版本中,向导已默认选择了EFCore。项目结构也与XPO的保持一致,主要差别是在BusinessObjects文件夹中,同时多了一个XAF_EFCore_SampleDbContext类,这个是EFCore的DbContext,类似XPO的Session。
运行
如果熟悉XPO的小伙伴会直接运行,直接运行也是可以的,但事后数据迁移会麻烦,下面我们用EFCore的方式来启动这个项目。
首先我们在主项目(XAF_EFCore_Sample.Blazor.Server)中添加Microsoft.EntityFrameworkCore.Tools包,这样我们就可以直接使用Add-Migration、Update-Database等迁移工具
你可以在程序包管理器控制台中输入Install-Package Microsoft.EntityFrameworkCore.Tools -Version 6.0.3,注意:版本是6.0.3,默认项目选择 XAF_EFCore_Sample.Blazor.Server,后面还会用到程序包管理器控制台
如果现在直接运行数据迁移它会报错,我们还需要配置一下,打开XAF_EFCore_SampleDbContext这个文件,找到XAF_EFCore_SampleDesignTimeDbContextFactory这个类
它上面已经有了说明,我们需要将异常及注释移除
现在我们就可以进行数据迁移了,打开程序包管理器控制台,输入Add-Migration Initialize_Database,默认项目选择 XAF_EFCore_Sample.Module,这样在XAF_EFCore_Sample.Module项目下会多出一个Migrations文件夹,打开20230518004940_Initialize_Database.cs这个文件,里面有数据迁移的代码,感兴趣的可以看一下。
Add-Migration命令是用于添加数据迁移代码文件,Initialize_Database是给这个迁移文件起的名字
下面我们需要更新数据库,在程序包管理器控制台中,输入Update-Database,这样就可以将我们之前的数据迁移执行到数据库中了,现在可以直接运行项目了,运行起来与XPO版本的没有什么区别。
如果我们要向ApplicationUser类中添加属性,我们需要重复前面的步骤,这个与XPO不同,XPO是自动迁移,而EFCore需要手动操作。我们下面向ApplicationUser类中添加Image属性,为用户添加一个图像
EFCore属性的写法与XPO也不一样,注意要加上virtual,这样XAF可以通过代理的方式来监听属性的变化,XAF文档中有一篇关于EFCore与XPO的比较 https://docs.devexpress.com/eXpressAppFramework/404186/why-we-recommend-ef-core-over-xpo
下面我们需要在程序包管理器控制台中,输入Add-Migration AddUserImage,执行完后,再次输入Update-Database,注意默认项目为XAF_EFCore_Sample.Module,运行后的效果
改造
下面我们改造一下,在XAF_EFCore_SampleDesignTimeDbContextFactory中,我们需要硬编码的方式指定数据库连接参数,这样我们在修改配置文件后,还要修改这个连接参数,下面我们直接用读取配置文件的方式来获取数据库连接参数
在XAF_EFCore_Sample.Module项目中添加包Microsoft.Extensions.Configuration.Json,注意版本号为6.0.0,修改后的代码
最后
EFCore现在已是dotnetcore的主流ORM框架,再加上XPO早已处于维护状态,在XAF中使用EFCore应该是大势所趋,但已在运行的XPO项目不建议切换到EFCore,因为它们之间还有很多的不同,新的项目可以考虑采用EFCore。