【发布时间】: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