XAF EFCore 示例

前言

在DEV官方建议创建新的XAF项目推荐选择EFCore时,我也第一时间创建了XAF的EFCore项目,这也是我第一次创建这个类型的项目,之前一直使用XPO,避免不了要对比一下。如果熟悉XPO但不了解EFCore的小伙伴来说,会有些迷茫,再加上通过向导创建的项目并不是开箱即用,还需要进行配置,可能会打击想了解EFCore小伙伴的积极性,下面我会简单的讲解一下XAFEFCore项目创建及配置的过程。示例项目放到了gitee中,http://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的比较 http://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。

http://www.cnblogs.com/haoxj/p/17410846.html

本文转载于网络 如有侵权请联系删除

相关文章

  • 英伟达游戏显卡营收暴跌/ 谷歌数据中心爆炸致3人受伤/ iPhone电量百分比回归…今日更多新鲜事在此

    日报君发自凹非寺 量子位|公众号QbitAI大家好,今天是秋意凉爽的8月9日,星期二。来和日报君一起看看,今天的科技圈有哪些大新闻?今日大新闻消失5年,iPhone电量百分比回归今天凌晨,苹果推送的iOS16Beta5加入了电池百分比选项,电池百分比以数字形式被写入电池图标内,用户可以在主屏看到精确的电量百分比。2017年,苹果发布iPhoneX,该机型采用全新“刘海屏”设计,同时也取消了包括电池状态指示器在内的部分原功能。基于此,苹果用户只能向下滑动,才能在通知阴影区看到电池百分比。对此,苹果发言人暂未透露电池百分比是否会延续到iOS16的最终版本,这次更新目前只出现在开发者版和公测版。此外,苹果在iOS16Beta4后加入的Siri语音关机功能又被取消,变成了此前的传统提醒,需要按住物理按钮,并且拖动屏幕上的滑块。预计苹果将于今年9月iPhone14系列发布会上推出iOS16系统正式版本。武汉、重庆开启全无人自动驾驶商业运营昨日(8月8日)开始,市民在武汉市经开区和重庆市永川区的特定区域内,可以打到全无人自动驾驶出租车。两地政府还向百度发放了全国首批无人化示范运营资格。此次,武汉经

  • LinkedIn搜索系统的深度自然语言处理(CS)

    许多搜索系统处理大量的自然语言数据,例如搜索查询、用户配置文件和文档,基于深度学习的自然语言处理技术(深度NLP)可以提供很大的帮助。本文介绍了深度自然语言处理技术在搜索引擎中的应用。通过这五个任务的模型设计和实验,读者可以找到三个重要问题的答案:(1)深层自然语言处理在搜索系统中什么时候有用/没用?(2)如何解决延迟挑战?(3)如何保证模型的稳健性?这项工作建立在LinkedIn搜索现有成果的基础上,并在一个商业搜索引擎上进行了大规模测试。我们相信我们的经验可以为业界和研究团体提供有用的见解。原文题目:DeepNaturalLanguageProcessingforLinkedInSearchSystems原文:Manysearchsystemsworkwithlargeamountsofnaturallanguagedata,e.g.,searchqueries,userprofilesanddocuments,wheredeeplearningbasednaturallanguageprocessingtechniques(deepNLP)canbeofgreathelp.Int

  • python学习笔记(1)什么是python?

    什么是python?Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,Python由GuidovanRossum于1989年底发明,第一个公开发行版发行于1991年。像Perl语言一样,Python源代码同样遵循GPL(GNUGeneralPublicLicense)协议。官方宣布,2020年1月1日,停止Python2的更新。Python2.7被确定为最后一个Python2.x版本。python语言的9大特点。1:简单。python遵循"简单、优雅、明确"的设计哲学。 2:高级。python是一种高级语言,相对于c,牺牲了性能而提升了编程人员的效率。它使得程序员可以不用关注底层细节,而把精力全部放在编程上。 3:面向对象。python既支持面向过程,也支持面向对象。 4:可扩展。可以通过c、c++语言为python编写扩充模块。 5:免费和开源。 6:边编译边执行。python是解释型语言,边编译边执行。 7:可移植。python能运行在不同的平台上。 8:丰富的库。python拥有许多功能丰富的库。 9:可嵌入性。python可以嵌入到c、c+

  • 基于客户融合创新,实现多波次稳步增长 ——KDDI的增长战略

    日本运营商KDDI在FY2014.3~FY2022.3的3个三年战略规划期分别提出了“3M战略”、“生活设计战略”、“整合基础电信服务与生活设计服务战略”,创新性推进各类融合策略,实现营业收入的多波次增长。图1:FY2014.3~FY2020.3KDDI营业收入增幅及战略规划一基础电信服务融合发展:终端+网络+应用的“3M战略”,实现双位数高增长“3M战略”为多应用(Multi-Use)、多终端(Multi-Device)、多网络(Multi-Network),分别强调了优质的数字应用创造新的用户体验,更多终端产品提升智能终端渗透率,丰富的智能网络环境深入推进融合捆绑业务。在新的竞争增长周期,推出“auSmartValue”,布局固移捆绑销售,让利消费者的同时,获取用户增长。推出“auSmartPass”,为用户提供超500款流行APP,以及存储、安全、积分等增值权益,加强差异化运营优势。在规划期首年FY2014.3财年,营业收入达到18.3%的双位数高增长。二个人经济生态圈融合发展:围绕移动支付的“生活设计战略”,拉动收入稳定增长“生活设计战略”基于移动支付扩大个人生活服务经济圈,为

  • arm(2)| 汇编指令和伪指令

    今天我们来说一下arm的汇编指令和伪指令。一、指令和伪指令我们首先来了解一下什么叫做指令和伪指令。指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。所以指令和伪指令最大区别就是编译完之后会不会生成机器码。arm汇编有两种风格,ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如:LDRR0,[R1]。GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldrr0,[r1]。二、arm汇编特点ARM汇编特点1:LDR/STR架构。ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。ldr(loadregister)指令将内存内容加载入通用寄存器。str(storeregister)指令将寄存器内容存入内存空间中。ldr/str组合用来实现ARMCPU和内存数据交换。ARM汇编特点2:8种寻址

  • pidstat-进程性能分析工具

    pidstat:是一个常用的进程性能分析工具,用来实时查看进程的CPU、内存、I/O以及上下文切换等性能指标。常用选项:   -u:表示查看cpu相关的性能指标   -w:表示查看上下文切换情况   -t:查看线程相关的信息,默认是进程的;常与-w结合使用(cpu的上下文切换包括进程的切换、线程的切换、中断的切换)    -d:展示磁盘I/O统计数据    -p:指明进程号 cpu用法示例:#pidstat-u51 13:37:07UIDPID%usr%system%guest%wait%CPUCPUCommand 13:37:1202962100.000.000.000.00100.001stress复制%usr:用户空间的cpu使用率%system:内核空间的cpu使用率%wait:等待上下文切换的cpu使用率%CPU:总的cpu使用率查看进程的cpu上下文切换示例:vmstat只能查看总的cpu上下文切换,pidstat可以查看每个进程的上下文切换#每隔5秒输出1组数据 $pidstat-w5 Linux4.15.0(ubuntu)09/23/18_x86_64_(2CPU)

  • python+pygame游戏开发之使用Py2exe打包游戏

    最近在用python+pygame开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本。这会吓退99%以上的人……所以把我们的游戏打包(注意是打包而不是编译,python毕竟是脚本程序)成一个可执行文件势在必行。在网上搜了几款关于python打包的程序,使用以后发现Py2exe是比较实用和方便的(py2exe是免费的)。1.简介Py2exe可以将一个Python程序打包成exe可执行文件,方便没有Python环境的电脑上使用程序。使用Py2exe打包需要编写一个打包脚本,执行后可以得到打包文件。对于32位版本,Py2exe可以将程序打包成单文件;对于64位版本,暂时还不支持打包成单文件。不过,无论如何压缩,目前Py2exe打包出来的程序都还是偏大的。2.软件准备首先到py2exe的官网http://www.py2exe.org/去下载安装包,注意需要对应自己的python版本,要不然会出现问题。双击exe文件,一路next下去即可。需要注意的是,32位版本和64位版本必须和Python使用的版本配套。3.打包流程py2exe是需要写一个脚本进行

  • AQS简简单单过一遍

    前言回顾前面:多线程三分钟就可以入个门了!Thread源码剖析多线程基础必要知识点!看了学习多线程事半功倍Java锁机制了解一下只有光头才能变强!本来我是打算在这章节中写Lock的子类实现的,但看到了AQS的这么一个概念,可以说Lock的子类实现都是基于AQS的。AQS我在面试题中也见过他的身影,但一直不知道是什么东西。所以本篇我就来讲讲AQS这个玩意吧,至少知道它的概念是什么,对吧~那么接下来我们就开始吧~一、AQS是什么?首先我们来普及一下juc是什么:juc其实就是包的缩写(java.util.concurrnt)不要被人家唬到了,以为juc是什么一个牛逼的东西。其实指的是包而已~我们可以发现lock包下有三个抽象的类:AbstractOwnableSynchronizerAbstractQueuedLongSynchronizerAbstractQueuedSynchronizer通常地:AbstractQueuedSynchronizer简称为AQS我们Lock之类的两个常见的锁都是基于它来实现的:那么我们来看看AbstractQueuedSynchronizer到底是什么,

  • 【业界】Facebook对收集用户通话和短信数据的言论作出了回应

    AiTechYun编辑:nanan也许你可以查看一下你的数据档案,看看Facebook的算法是否知道你打过电话给谁。Facebook对有关收集通话和短信数据的报道作出了回应,并在自己的博客文章中,否认收集通话数据相关报道。该公司还写道,它从未出售过数据,并且用户自己是可以掌控上传到Facebook上的数据的。这一“事实核查”与Ars分析Facebook数据下载和提供数据的用户的证词中发现的几个细节相矛盾。上周,一名新西兰男子DylanMcKay正在浏览Facebook从社交网站上下载的档案中收集的数据。在浏览Facebook存储的关于他的联系人信息时,DylanMcKay发现了一些令人不安的事情:Facebook也从他的Android手机中获得了大约两年的通话元数据,其中包括姓名、电话号码以及每次通话的时长。许多与Ars交谈的Facebook用户以及我们独立的Facebook用户都分享了这种体验,我发现,我的Facebook数据存档包含2015年和2016年使用的特定Android设备的通话记录数据,以及SMS和MMS消息元数据。针对Ars关于此次数据收集的电子邮件询问,Faceboo

  • shell基本命令

    有关文件显示的命令: du--exclude=iso -sh .      //统计当前除了iso这个目录的其他文件大小 ls-F                                 //列出的时候每个目录后加了个/可执行文件加* ls-F*/                               //列出当前所有目录下的所有文件 ls-F|grep/$                    //列出所有目录(过滤以/结尾的文件,其实就是目录)$标识以什么结尾,^表示以什么开头 ls -d */                            //列出所有目录 ll -S  //按照文件大小排序 #ifconfigbr0|grepinet|awk-F:'{print}' -F指定分隔符打印出IP #sed's/bash/xxbandy/g'hello           批量替换 在vim中批量替换:                :%s/bash/xxbandy/g   全文所有替换 :%s/bash/xxband

  • Tabby,一款老外都在用的 SSH工具,竟然还支持网页操作

    会编程的蜗牛 主要分享java编程,也会涉及其他方向的技术分享。 1篇原创内容 公众号 序言各位好啊,我是会编程的蜗牛,作为java开发者,或者说编程人员,程序员的我们,Linux服务器总是我们一个绕不开的东西(只用Windows部署应用的当我没说)。我们在平常连接linux服务器的时候,一般用的最多的可能是Xshell、SecurityCRT、FinalShell,这几个工具我之前都有用过,总得来说,Xshell、SecurityCRT这两个都是需要正版授权的,使用中也各有千秋,Xshell界面做的比较酷炫,也支持直接拖动传输文件,在这些方面,SecurityCRT就略逊一筹了,不过作为老牌SSH连接工具,它还是被很多应用设置成默认打开远程连接的工具,像各种堡垒机之类的。FinalShell是开源免费的,虽然也支持文件直接上传,也就是SFTP,但是经常用着用着突然就卡住了,还经常提示升级,可能是用java写的原因吧。   看来我们的java还是只能专注于做服务端啊,就像今天要推荐的这个新的SSH连接工具Tabby,是一款在github上拥有超高人气的连接工具,今天我们来

  • FreeSql (二十八)事务

    1、外部事务 在外部开启事务的场景,可使用WithTransaction传入事务对象。 awaitfsql.Update<xxx>() .WithTransaction(指定事务) .Set(a=>a.Clicks+1) .ExecuteAffrowsAsync(); 复制 ISelect、IInsert、IUpdate、IDelete,都支持WithTransaction方法。 2、同线程事务 同线程事务,由fsql.Transaction管理事务提交回滚(缺点:不支持异步),比较适合WinForm/WPFUI主线程使用事务的场景。 用户购买了价值100元的商品:扣余额、扣库存。 fsql.Transaction(()=>{ //fsql.Ado.TransactionCurrentThread获得当前事务对象 varaffrows=fsql.Update<User>() .Set(a=>a.Wealth-100) .Where(a=>a.Wealth>=100).ExecuteAffrows(); //判断别让用户余额扣成负数

  • cilium

    看到cilium这个网络插件用的是ebpf,所以我对k8s网络的研究,就直接以cilium来入门了,这个门槛还是比较高的 在kind集群上,已经把整个虚拟网络给搭建了起来了,但是对组件之间的数据流还不是很清楚,cilium提供了一种简单而有效的方法来定义和执行给予容器/Pod身份的网络层和应用层安全策略。 在整个cilium架构中,除了key-value数据存储之外,主要组件包括ciliumagent和ciliumoperator,还有一个客户端的工具叫ciliumcli 通过插件和容器运行时和容器编排系统进行交互,进而为北极上的容器进行网络以及安全的配置。同时提供了开放的api接口,供其他的组件进行调用; cilium在进行网络和安全的相关配置的时候,采用eBPF的程序实现,结合容器标志以及相关的策略,生成eBPF程序,比你更切讲ebPF程序编译成字节码,将他们传递到linux内核。

  • 代码随想录Day18

    LeetCode226 翻转二叉树     思路:遍历节点,交换左右孩子的顺序即可。前序遍历(中左右)、后序遍历(左右中)都可以,中序遍历这样写就行不通,会做多余的翻转操作。 遍历的写法:1.确定参数和返回值  参数:根节点,返回值TreeNode。这是题目规定好的,无需多言 2.终止条件   当前节点为空节点,返回 3.单层递归顺序。  前序,后序遍历都可。   迭代法的写法;迭代法,主要是深度优先遍历和广度优先遍历的写法。 深度优先遍历(栈):   1.当前节点不为空,压入栈 2.当栈内不为空,获取栈顶元素,出栈。 并交换栈顶元素的左右孩子 3.做前序遍历。如果栈顶存在左孩子,压入栈。左孩子遍历完再遍历右孩子。   广度优先遍历(层序遍历,队列):  把每层的值进行交换 广度优先遍历和深度优先遍历的不同之处在于。 广度优先遍历,拿到每一层的所有元素,进行一个顺序交换。深度优先遍历,从一个节点一直走下去,再往回走。 //DFS递归 class

  • jQuery外部框架浅析

    (function(window,undefined){     varjQuery=...     ...       window.jQuery=window.$=jQuery; })(window); 整个代码包裹在一个立即执行匿名函数内。 这样写的优点: 1.通过写立即执行匿名函数,这样不会干扰jQuery内部的代码,也不会破坏和污染全局变量; 2.把window当做参数传进去:   (1)能缓存window对象,使其变成局部变量,可以缩短查找作用域链,加快查找速度;   (2)使压缩比提高,方便压缩优化; 3.把undefined当做变量传进去,但是调用的时候不传参:   (1)能防止undefined在低版本浏览器(ie8及以下)被重写;   (2)能缓存undefined,可以缩短查找undefined的作用域链;   (3)提高压缩比

  • BZOJ 1710: [Usaco2007 Open]Cheappal 廉价回文

    Description为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统.他给了每一个头牛一个电子牌号当牛走过这个系统时,牛的名字将被自动读入.每一头牛的电子名字是一个长度为M(1<=M<=2,000)由N(1<=N<=26)个不同字母构成的字符串.很快,淘气的牛找到了系统的漏洞:它们可以倒着走过读码器.一头名字为"abcba"不会导致任何问题,但是名为"abcb"的牛会变成两头牛("abcb"和"bcba").农夫JOHN想改变牛的名字,使得牛的名字正读和反读都一样.例如,"abcb"可以由在尾部添加"a".别的方法包括在头上添加"bcb",得到"bcbabcb"或去掉"a",得到"bcb".JOHN可以在任意位置添加或删除字母.因为名字是电子的,添加和删除字母都会有一定费用.添加和删除每一个字母都有一定的费用(0<=费用<=10,000).对与一个牛的名字和所有添加或删除字母的费用,找出修改名字的最小的费用.空字符串也是一个合法的名字.Input*第一行:两个用空格分开的数,N和M.*第二行:M个自符,初始的牛的名字.*第3...N+2行:每

  • 足球赛售票2

    #include<stdio.h>#defineMAX 200intmain(){   intn,i,j,a[MAX][MAX]={0};   scanf("%d",&n);    for(i=0;i<=n;i++)   a[i][0]=1;   for(i=1;i<=n;i++)       for(j=1;j<=i;j++)           a[i][j]=a[i-1][j]+a[i][j-1];   printf("%d\n",a[n][n]);}         #include<stdio.h>#defineMAX&nb

  • linux下python3离线加载nltk_data,不用nltk.download()

    在不能上网的服务器上把nltk_data关联到python3,已经安装anaconda3所以不需要安装nltk,环境是linux 首先没有nltk_data在使用nltk会报错 LookupError: ********************************************************************** Resource'tokenizers/punkt/PY3/english.pickle'notfound. PleaseusetheNLTKDownloadertoobtaintheresource:>>> nltk.download() Searchedin: -'/home/hadoopcj/nltk_data' -'/usr/share/nltk_data' -'/usr/local/share/nltk_data' -'/usr/lib/nltk_data' -'/usr/local/lib/nltk_data' -'/home/hadoopcj/nltk_data' -''复制 1.下载nltk_data htt

  • HashCode 解析

    前言Object提供给我们了一个Native的方法“publicnativeinthashCode();”,本文讲讲Hash是什么以及HashCode的作用 Hash先用一张图看下什么是HashHash是散列的意思,就是把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值。关于散列值,有以下几个关键结论:1、如果散列表中存在和散列原始输入K相等的记录,那么K必定在f(K)的存储位置上2、不同关键字经过散列算法变换后可能得到同一个散列地址,这种现象称为碰撞3、如果两个Hash值不同(前提是同一Hash算法),那么这两个Hash值对应的原始输入必定不同 HashCode然后讲下什么是HashCode,总结几个关键点:1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的2、如果两个对象equals相等,那么这两个对象的HashCode一定也相同3、如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写4、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在

  • web前端面试总结

    一、CSS问题 1.flex布局 display:flex;在父元素设置,子元素受弹性盒影响,默认排成一行,如果超出一行,按比例压缩flex:1;子元素设置,设置子元素如何分配父元素的空间,flex:1,子元素宽度占满整个父元素align-items:center定义子元素在父容器中的对齐方式,center垂直居中justify-content:center设置子元素在父元素中居中,前提是子元素没有把父元素占满,让子元素水平居中。 2.css3的新特性 transtiontransition-property规定设置过渡效果的CSS属性的名称。 transition-duration规定完成过渡效果需要多少秒或毫秒。 transition-timing-function规定速度效果的速度曲线。 transition-delay定义过渡效果何时开始。 animation属性可以像Flash制作动画一样,通过控制关键帧来控制动画的每一步,实现更为复杂的动画效果。 ainimation实现动画效果主要由两部分组成: 通过类似Flash动画中的帧来声明一个动画;

  • 数据分析

    数据分析 1、数据分析编辑器 2、numpy 3、pandas 4、matplotlib绘图

相关推荐

推荐阅读