EntityFrameworkCore.Jet:脚手架不起作用 - COMException (0x800A0CB3)

问题描述 投票:0回答:1

问题

当我尝试构建 Nordhwind.accdb 时,我收到 COM 异常

在 VSCode Powershell 终端中:

dotnet ef dbcontext scaffold "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=<PATH>\northwind.accdb" EntityFrameworkCore.Jet -o Models

在 Visual Studio 2022 Paket Manager 控制台中:

Scaffold-DbContext -Connection "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=<PATH>\northwind.accdb" -Provider EntityFrameworkCore.Jet

例外:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.Runtime.InteropServices.COMException (0x800A0CB3): Das Objekt oder der Provider kann den angeforderten Vorgang nicht ausführen.
   --- End of inner exception stack trace ---
   at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
   at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)    
   at EntityFrameworkCore.Jet.Data.ComObject.TryGetMember(GetMemberBinder binder, Object& result)
   at CallSite.Target(Closure, CallSite, Object)
   at EntityFrameworkCore.Jet.Data.AdoxSchema.GetColumns()
   at EntityFrameworkCore.Jet.Data.PreciseSchema.GetColumns()
   at EntityFrameworkCore.Jet.Data.JetStoreSchemaDefinition.JetInformationSchema.GetColumns(JetConnection connection)
   at EntityFrameworkCore.Jet.Data.JetStoreSchemaDefinition.JetInformationSchema.GetDbDataReaderFromSimpleStatement(JetCommand command)
   at EntityFrameworkCore.Jet.Data.JetStoreSchemaDefinition.JetInformationSchema.TryGetDataReaderFromInformationSchemaCommand(JetCommand command, DbDataReader& dataReader)
   at EntityFrameworkCore.Jet.Data.JetCommand.ExecuteDbDataReaderCore(CommandBehavior behavior)
   at EntityFrameworkCore.Jet.Data.JetCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at EntityFrameworkCore.Jet.Scaffolding.Internal.JetDatabaseModelFactory.GetColumns(DbConnection connection, IReadOnlyList`1 tables)
   at EntityFrameworkCore.Jet.Scaffolding.Internal.JetDatabaseModelFactory.GetTables(DbConnection connection, Func`3 filter)
oryOptions options)
   at EntityFrameworkCore.Jet.Scaffolding.Internal.JetDatabaseModelFactory.Create(String connectionString, DatabaseModelFactoryOptions options)
   at Microsoft.EntityFrameworkCore.Scaffolding.Internal.ReverseEngineerScaffolder.ScaffoldModel(String connectionString, DatabaseModelFactoryOptions databaseOptions, ModelReverseEngineerOptions__DisplayClass0_0.<.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)

到目前为止我做了什么

我目前正在测试使用 EntityFrameworkCore.Jet 提供程序连接到现有的访问 mdb。出于测试目的,我从这里下载了最新的 Northwind.accdb:https://learn.microsoft.com/de-de/dotnet/framework/data/adonet/sql/linq/downloading-sample-databases

我在 Access 和 Visual Studio 2022(服务器资源管理器)中打开数据库以确保它可以访问。然后我创建了一个简单的项目,其中包含

DbContext
:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="EntityFrameworkCore.Jet" Version="7.0.3" />
    <PackageReference Include="EntityFrameworkCore.Jet.Data" Version="7.0.3" />
    <PackageReference Include="EntityFrameworkCore.Jet.Odbc" Version="7.0.3" />
    <PackageReference Include="EntityFrameworkCore.Jet.OleDb" Version="7.0.3" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.15" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.15">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="System.Data.OleDb" Version="7.0.0" />
  </ItemGroup>

</Project>
public class JetTestContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseJet(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=<PATH>\northwind.accdb;");
        }
    }

我还做了一个小单元测试,以确保可以实例化

JetTestContext

但这不应该以任何方式影响脚手架。我已经搜索过,但我发现的唯一解决方案是丢失或错误的 OLEDB 驱动程序,我不认为这是我的问题,因为我可以访问northwinddb,安装了 Access 并且可以使用 VS Server Explorer 浏览数据库。我在这里缺少什么?

ms-access entity-framework-core jet scaffold
1个回答
0
投票

Microsoft Access 本身不支持:

实体框架核心数据库提供程序

但是,可以使用第三方工具:

EntityFrameworkCore.Jet

EntityFrameworkCore.Jet 是 Entity Framework Core 提供程序 Microsoft Jet/ACE 数据库(支持 Microsoft Access 数据库 文件格式 MDB 和 ACCDB)。

© www.soinside.com 2019 - 2024. All rights reserved.