【问题标题】:ODP.NET Core - Scaffold DB-ContextODP.NET Core - 脚手架数据库上下文
【发布时间】:2018-09-11 16:09:11
【问题描述】:

我正在使用 oracles odp.net core beta 3。具体来说,该 dll 是 Oracle.ManagedDataAccess.Core.2.12.0-beta3。该项目是创建一个位于 oracle 实例之上的 Web 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)

【问题讨论】:

  • 这与提供者无关。由于 EF Core 现在使用 DI,它需要一个项目来“运行”以满足其依赖关系。最有可能的是,您的上下文位于类库中,除非您提供 IDesignTimeDbContextFactory 的实现,否则您无法迁移到该类库中。见:docs.microsoft.com/en-us/ef/core/miscellaneous/cli/…
  • 我正在尝试使用“Scaffold-DbContext”命令来创建上下文本身。如何确保它可以实现IDesignTimeContextFactory?
  • 你需要实现IDesignTimeDbContextFactory。在这一点上,该命令相当无关紧要。 任何 EF 命令都需要实例化你的上下文的一个实例,除非你的上下文在启动项目中或者你实现了这个接口,否则它不能这样做。请参阅我链接到的文档。
  • 好的,我现在对你所说的有了更深的理解。关于 OptionsBuilder 组件使用什么的任何想法。有options.UseOracle 或options.UseODPNET 之类的东西吗?我需要自己建造吗?
  • 我认为有。它来自提供者本身,所以一旦你安装了适当的包,你应该在那里得到你需要的任何扩展方法。

标签: asp.net-core odp.net


【解决方案1】:

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

我联系了 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) 中描述的方式。

【讨论】:

  • 我也发现了这一点。通过完全绕过实体框架并使用dapper,我能够启动并运行我的解决方案。我必须说我对它非常满意,尽管它缺少一些与 EF 一起打包的有用工具
【解决方案2】:

我设法用

搭建了它

scaffold-dbcontext "数据源=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=1.1.1.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MYdb)));Persist Security Info=True ;用户 ID=MYUSER;密码=mypass;" Oracle.EntityFrameworkCore

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

无法构建外键“XX.TABLE1(USER_ID,USER_ID)”。在主体实体类型“Aspnetusers”中找不到“ID,ID”的键。

看来 Dapper 是我的朋友……

【讨论】:

    【解决方案3】:

    我用这个搭建了一些表格:

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

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

    生产的模型完全没问题。可能取决于 EF Core 版本或指定表名。

    【讨论】:

      【解决方案4】:

      对于 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 2020-05-28
        相关资源
        最近更新 更多