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。
https://www.cnblogs.com/haoxj/p/17410846.html
XAF EFCore 示例的更多相关文章
- XAF导航系统介绍
Navigation System 导航系统 10 min to read 阅读时长10分钟 This topic introduces the concept of the navigation s ...
- XAF点滴:很具体很用实用---处理三个小问题
以下内容全部为web版本的老模板风格下完成. 一.在编辑状态的详细视图下打印报表. 有些时候,需要在编辑状态下直接打印报表内容,官方默认是不允许这样做的.用Reflector查看源码,可以看到: De ...
- XAF How to: 实现一个WCF Application Server 并配置它的客户端应用
本主题描述了如何实现一个 WCF 中间层应用程序服务器及如何配置 XAF客户端连接到此服务器. 注意 本主题演示可以由解决方案向导自动生成的代码.执行操作时,如果你想要在现有的 XAF 解决方案中实现 ...
- XAF使用数据库访问层缓存的提升性能
很多时候,为了提升性能,我们可以给数据库访问层做缓存. 以下几步可以完成这个任务:1. 使用自定义的 XPObjectSpaceProvider1.1. 创建自定义的 XPObjectSpacePro ...
- XAF应用开发教程(七)外观控制模块
很多时候,我们需要按照不同的条件显示不同的效果,在传统的软件开发中,我们会直接使用 控件名称.BackColor,Enable,Visible等属性进行控制. 如果一个业务对象在多处使用,要么我们会去 ...
- XAF应用开发教程(四)应用程序模型
XAF是重量型框架,确实够重量的,方方面面都做得规规矩矩. 如果看了前面三节,可能会认为,这N多的Attribute到底都是从哪里来的?到底有多少这样的Attribute?如果不够用了怎么办?等着官方 ...
- XAF应用开发教程(三)业务对象模型之引用类型与关联关系
本节介绍信息系统开发中最常见的问题,引用关系,一对多关系,多对多关系. 以客户信息为例,客户通常需要客户分类,如VIP客户,普通客户,潜在客户.当然,我们可以定义枚举类型进行定义出这个类型,并在客户类 ...
- XAF应用开发教程(二)业务对象模型之简单类型属性
使用过ORM的朋友对这一部分理解起来会非常快,如果没有请自行补习吧:D. 不说废话,首先,我们来开发一个简单的CRM系统,CRM系统第一个信息当然是客户信息.我们只做个简单 的客户信息来了解一下XAF ...
- XAF应用开发教程(一) 创建项目
XAF是DevExpress公司的快速开发框架,全称eXpress Application Framework,是企业信息系统的开发利器,快速开发效果显著,在.net框架中,笔者至今没有找到一款可以与 ...
- Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库
前言 在 .Net Core 2.2中 Microsoft.AspNetCore.App 默认内置了EntityFramework Core 包,所以在使用过程中,我们无需再从 NuGet 仓 ...
随机推荐
- Mybatis(一对一、一对多、多对多)操作
* 首先列出示例中用到的数据库表 user表: accout表: role表: user_role表: 建表语句如下: DROP TABLE IF EXISTS `user`; CREATE TABL ...
- Ubuntu ISO镜像文件下载(Ubuntu 22.04.2 LTS)
Ubuntu 22.04.2 LTS 链接:https://pan.baidu.com/s/1YuWSOBH9mTZMjJTW7HM91g 提取码:b8lf
- docker安装oracle数据
docker安装oracle数据库 1️⃣ 通过docker拉取并启动oracle11g(此版本目前主流),docker换源及安装mysql看Springboot创建项目及测试 - $YX$ - 博客 ...
- PHP 会话(Session)实现用户登陆功能
PHP 会话(Session)实现用户登陆功能 Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量.UID 存储在 cookie 中,或者通过 U ...
- 深入浅出Java多线程(八):volatile
引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第八篇内容:volatile.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在当今的软件开发领域,多线程编程 ...
- nginx 配置mp4文件播放
nginx 配置mp4文件播放 由于工作需要一个离线的视频播放地址,就想简单一点直接把视频文件放到nginx里面实现视频播放,但是把mp4文件放上去之后地址栏输入地址直接就是下载文件,这跟我想象的 ...
- 未配置Datasource时, 启动 SpringBoot 程序报错的问题
SpringBoot will show error if there is no datasource configuration in application.yml/application.pr ...
- 【Unity3D】动画回调函数、动画事件、动画曲线
1 动画回调函数 动画回调函数是指动画在开始时.执行中.结束时回调的函数,主要有:OnStateEnter.OnStateUpdate.OnStateExit.OnStateMove.OnStat ...
- useEffect与useLayoutEffect
useEffect与useLayoutEffect useEffect与useLayoutEffect可以统称为Effect Hook,Effect Hook可以在函数组件中执行副作用操作,副作用是指 ...
- win32 - Screen to bmp file(BYTE)
void WINAPI CaptureScreenIntoFile() { BITMAPFILEHEADER bfHeader; BITMAPINFOHEADER biHeader; HGDIOBJ ...