2.NET 4.6.1向.NET core 2.0项目迁移(EntityFramework篇)

作为一个.net core 的新手,在代码迁移的道路上,到处是坑,但是不要害怕,遇水搭桥、遇坑填坑,今天记录下EF所遇到的问题。

众所周知,EF是微软推出的很好用的实体映射框架(ORM object record mapping),我工作过的项目从.net 2.0以来到.net 4.6,所有项目都用它来访问数据库不论是mysql\sql server或是oracle, 到.net core微软同样出了Microsoft.EntityFrameworkCore的包支持。

https://www.nuget.org/packages?q=entityframeworkcore 你可以看到各种数据库对应的.net core版本。

Microsoft.EntityFrameworkCore 

Microsoft.EntityFrameworkCore.SqlServer

Microsoft.EntityFrameworkCore.Sqlite 

MySql.Data.EntityFrameworkCore 

这里列出几个常用的数据库,

本例使用VS Code经过实测,mysql 和sql server版本都成功的实现了实体生成,oracle的实体生成过程遇到一些问题。

以下说一下过程:

1. Sql Server EntityFrameworkCore的使用:

同样,首先将包引用进来,编辑HelloWorld.csproj,增加<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.3" />

因为我的.net core sdk版本为2.2,此处我使用2.2.3的版本,3.0版本(目前是预览版)应该也是一样的,可以向下兼容支持。

命令行执行 dotnet restore,

可以看到在obj/project.assets.json中自动引用了依赖的一些包,象Microsoft.EntityFrameworkCore/Abstractions/Analyzers/Design等。

当然引用的过程也可以用命令行:dotnet add package Microsoft.EntityFrameworkCore.SqlServer

因为已有数据库,这里用DB first方式,生成实体,还是一如既往的命令行:dotnet ef -?

当我们输入这个命令时,可以看到有三种用法 database/dbcontext/migrations ,生成数据库(database)和迁移(Migrations)在本例不做说明。

当然,我们使用dbcontext生成实体上下文,继续dotnet ef dbcontext -?

还是三种用法: info/list/scaffold

scaffold就是本例所需要的,生成实体的脚手架,回忆一下,在Visual Studio2017中,生成实体的过程,我们对照一下:

1.创建edmx数据模型,设计视图上右键从数据库生成,填入连线字串选择表,就会将表生成实体模型。再保存一下,IDE就自动帮我们生成DbContext及所有实体了。

2.也可以通过Scaffold-dbcontext脚手架命令行生成,工具-》nuget包管理器-》nuget包控制台,输入命令scaffold-dbcontext "connectionstring" provider-name -outDir,

上面第二种方式和我们本节的很接近了,闲话少说,回到本例:

继续敲入命令行:dotnet ef dbcontext scaffold -h

 

 有两个参数,connection和provider,以及一些参数选项,

dotnet ef dbcontext scaffold 'data source=.;database=helloworld;Integrated Security=true;' Microsoft.EntityFrameworkCore.SqlServer -o Models -t myTable

示例是生成指定表myTable的实体,前提是本地sql server数据库存在helloworld及相应的表myTable

执行命令可以看到在指定的Models目录下生成了两个文件 helloworldContext.cs和myTable.cs两个文件。

可以看到生成的myTable实体里,类名和字段名都是首字母大写,如果你想与数据库里名称大小写致可以使用--use-database-names选项,另外如果重复执行生成实体需要指定 -force强制覆盖选项。

至此SqlServer的EFcore支持很顺利的完成,接下来试试Oracle的EFcore支持。

2.Oracle对EntityFrameworkCore的支持:

 增加包引用:dotnet add package Oracle.EntityFrameworkCore

提示:

没有明确指定包的版本,所以出错,信息里已经指出了可以用2.18.0-beta3的版本,

所以再执行:dotnet add package Oracle.EntityFrameworkCore -v 2.18.0-beta3

引用包成功,

接下来就是生成实体了,依上面sqlserver的命令,把连线字串改成oracle的,同时更改provider名字,

dotnet ef dbcontext scaffold 'data source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.0.1)(PORT = 1522)))(CONNECT_DATA = (SERVICE_NAME = service)));PASSWORD=test;user id=test' Oracle.EntityFrameworkCore -o Models -t myTable -f

 错误示ORA-00904: "C"."USER_GENERATED": 标识符无效,

从plsql中查看,user_tab_cols是一个视图,直接执行select * from user_tab_cols确实没有User_generated这个字段,可以看到我的这个oracle是11.2的版本,难道是数据库版本过旧?由于手头没有12i及以上版本,没法实测,望其它朋友回复告知。

从另外一个方面思考,其它的oracle provider包能不能支持呢?

https://www.nuget.org/packages?q=entityframeworkcore.Oracle 查看官网支持的provider还不少,

试试Ctims.EntityFrameworkCore.Oracle:

安装包dotnet add package Citms.EntityFrameworkCore.Oracle

执行命令:

dotnet ef dbcontext scaffold 'data source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.0.1)(PORT = 1522)))(CONNECT_DATA = (SERVICE_NAME = service)));PASSWORD=test;user id=test' Citms.EntityFrameworkCore.Oracle -o Models -t myTable -f

WTF,出了新的异常信息,"C"."IDENTITY_COLUMN": 标识符无效,

难道是用户权限问题?度娘一下,要以sysdba登录,

grant sysdba to test;

同时更改连线字串,增加DBA Privilege=SYSDBA

再试:

dotnet ef dbcontext scaffold 'data source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.0.1)(PORT = 1522)))(CONNECT_DATA = (SERVICE_NAME = service)));PASSWORD=test;user id=test;DBA Privilege=SYSDBA' Citms.EntityFrameworkCore.Oracle -o Models -t myTable -f

 错误依旧,试了几个其它的provider都一样,没辙了。

失败告终!

猜你喜欢

转载自www.cnblogs.com/coolalam/p/10838379.html