zoukankan      html  css  js  c++  java
  • 2.NET 4.6.1向.NET core 2.0项目迁移(EntityFramework篇)

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

    众所周知,EF是微软推出的很好用的实体映射框架(ORM object record mapping),我工作过的项目从.net 2.0以来到.net 4.6,所有项目都用它来访问数据库不论是mysqlsql 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都一样,没辙了。

    最后,官网找到一个贴子:https://community.oracle.com/thread/4266670

    问题已回答。

    45e9b42e-dc45-4a27-880f-88f79fe95796Newbie

    Database R11.2  ; EF Core beta3

    System Report a Error  ORA-00904: "C"."USER_GENERATED": 标识符无效 When running command Scaffold-DbContext

    Alex Keh - Product Manager-Oracle
    正确答案作者: Alex Keh - Product Manager-Oracle 在 2019-5-1 下午2:42

    This is bug 29593228. It has been fixed in our code line and will be available starting with the beta 4.

    WTF....

  • 相关阅读:
    mysql 练习题
    mysql 语法
    mysql数据库简单练习(创建表格,增删改查数据)
    dom对象基础
    JS定时器
    JS小测验
    JS事件练习题
    JS事件
    dom对象
    tiles介绍
  • 原文地址:https://www.cnblogs.com/coolalam/p/10838379.html
Copyright © 2011-2022 走看看