ODP.NET Core-脚手架数据库上下文

时间:2018-09-11 16:09:11

标签: asp.net-core odp.net

我正在使用oracles odp.net core beta3。具体地说,该dll是Oracle.ManagedDataAccess.Core.2.12.0-beta3。该项目将创建一个位于oracle实例之上的Web api。

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

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

以及Package Manager终端中的实际命令

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)

4 个答案:

答案 0 :(得分:2)

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

我联系了Oracle社区寻求帮助。一个善良的灵魂回答说,如果我们想立即获得善良,例如“ UseOracle”,那还有另一个难题。它是Entity Framework Core的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)中描述的方法。

答案 1 :(得分:0)

我设法使用

  

scaffold-dbcontext“数据源=(DESCRIPTION =(地址=(PROTOCOL = TCP)(HOST = 1.1.1.1)(PORT = 1521))(CONNECT_DATA =(SERVICE_NAME = MYdb)));持久安全信息= True ;用户ID = MYUSER;密码= mypass;“ Oracle.EntityFrameworkCore

但这是无法使用的混乱。大量错误

  

无法设置外键'XX.TABLE1(USER_ID,USER_ID)'。在主体实体类型“ Aspnetusers”中找不到“ ID,ID”的密钥。

好像Dapper是我的朋友...

答案 2 :(得分:0)

我用这个架了一些桌子:

Scaffold-DbContext“数据源= myDatabase.example.com / servicename; 用户ID =用户名;密码=密码;“ Oracle.EntityFrameworkCore -OutputDir myModels-表FIRSTTABALE,SECONDTABLE

表名必须为大写且Oracle EntityFrameworkCore版本为2.19.30。

生产的模型完全不错。也许取决于EF Core版本或指定表名。

答案 3 :(得分:0)

对于oracle db,使用它进入View->Other Windows->Package Manager Console:

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