ODP.NET 核心 - 脚手架 DB-Context

ODP.NET Core - Scaffold DB-Context

我正在使用 oracles odp.net 核心测试版 3。具体来说,dll 是 Oracle.ManagedDataAccess.Core.2.12.0-beta3。该项目是创建一个位于 oracle 实例之上的网络 api。

我的问题 - 此提供程序是否支持命令 "Scaffold-DBContext"。如果是这样,我做错了什么......我已经尝试使用类似于以下的连接字符串。

Data Source={databasename}/{TNS}.domain.local; User ID={UserName};Password={Password};

以及包管理器终端中的实际命令

Scaffold-DbContext Data Source={databasename}/{TNS}.domain.local; User ID={UserName};Password={Password};" Oracle.ManagedDataAccess -OutputDir Models -Tables {TableName}

我收到以下错误,表明它无法在提供程序程序集中使用 DesignTimeServiceAttribute。

我还参考了 Microsoft.EntityFrameworkCore.Tools (2.2.0),其中包括设计工具。

错误

    System.InvalidOperationException: Unable to find expected assembly attribute named DesignTimeProviderServicesAttribute in provider assembly Oracle.ManagedDataAccess. This attribute is required to identify the class which acts as the design-time service provider factory.
   at Microsoft.EntityFrameworkCore.Design.Internal.DesignTimeServicesBuilder.ConfigureProviderServices(String provider, IServiceCollection services, Boolean throwOnError)
   at Microsoft.EntityFrameworkCore.Design.Internal.DesignTimeServicesBuilder.Build(String provider)
   at Microsoft.EntityFrameworkCore.Design.Internal.DatabaseOperations.ScaffoldContext(String provider, String connectionString, String outputDir, String outputContextDir, String dbContextClassName, IEnumerable`1 schemas, IEnumerable`1 tables, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(String provider, String connectionString, String outputDir, String outputDbContextDir, String dbContextClassName, IEnumerable`1 schemaFilters, IEnumerable`1 tableFilters, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContext.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

即使在下载 ODP.NET 生产核心驱动程序(2.18.3,2018 年 9 月 20 日发布,可从 https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/ 的 nuget 获得)之后,我也遇到了您遇到的问题。

我联系了 Oracle 社区寻求帮助。一位善良的人回答说,如果我们想随时获得好处,例如 "UseOracle." 它是 Entity Framework 核心的 Oracle 提供者,那么还有另一块难题。请参阅 https://community.oracle.com/thread/4180739 处的主题。

据我所知并根据他的回答,使用它的唯一其他方法是 Oracle 帮助中心中描述的方法,ODP.NET Core (https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/ODPNET_Core_get_started/index.html) 入门。

我设法使用

搭建了它的脚手架

scaffold-dbcontext "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=1.1.1.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MYdb)));Persist Security Info=True;User Id=MYUSER;Password=mypass;" Oracle.EntityFrameworkCore

但这是一个无法使用的烂摊子。大量错误

Could not scaffold the foreign key 'XX.TABLE1(USER_ID,USER_ID)'. A key for 'ID,ID' was not found in the principal entity type 'Aspnetusers'.

看来Dapper是我的朋友...

我用这个搭建了一些 tables 的脚手架:

Scaffold-DbContext "Data Source=myDatabase.example.com/servicename; User ID=username;Password=password;" Oracle.EntityFrameworkCore -OutputDir myModels -Tables FIRSTTABALE,SECONDTABLE

table 名称必须大写,Oracle EntityFrameworkCore 版本为 2.19.30。

制作出来的模型完全没问题。可能取决于 EF Core 版本或指定 table 名称。

对于 oracle db,将其用于查看->其他 Windows->包管理器控制台:

Scaffold-DbContext "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT={your port}))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={db SID})));User ID={username};Password={pass};Persist Security Info=True" Oracle.EntityFrameworkCore -Tables TABLE1, TABLE2, ..., TABLEK -OutputDir Models -force