如何在.NET Core中使用Scaffold-DbContext用于Sqlite数据库

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

我正在使用 .NET Core 版本 7,并且我想使用 EF Core 访问 Sqlite (*.db3) 数据库文件。 这个文件有密码,我想先通过数据库将数据库表添加到项目中。 scaffold-dbcontext代码如下,但是报错,不带表。有什么问题吗?

一般来说,SQlite数据库表可以通过DatabaseFirst添加到项目中,或者只能通过CodeFirst添加,因为我搜索到的所有地方,Sqlite数据库都是通过CodeFirst创建的。

我想使用数据库优先方法。

Scaffold-DbContext "DataSource=Path\db.db3;Password=***" 
Microsoft.EntityFrameworkCore.Sqlite ...

我在项目中添加的库:

Microsoft.EntityFrameworkCore.Sqlite,
Microsoft.EntityFrameworkCore.Tools,
SQLitePCLRaw.bundle_e_sqlcipher,
Microsoft.EntityFrameworkCore.Sqlite.Design

此数据库文件是从 SqliteStudio 读取并显示表格:

错误文字:

为了保护连接字符串中潜在的敏感信息,您应该将其从源代码中移出。您可以使用 Name= 语法从配置中读取连接字符串,从而避免搭建连接字符串 - 请参阅https://go.microsoft.com/fwlink/?linkid=2131148。有关存储连接字符串的更多指导,请参阅 http://go.microsoft.com/fwlink/?LinkId=723263。 Microsoft.Data.Sqlite.SqliteException(0x80004005):SQLite错误26:“文件不是数据库”。 在 Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc,sqlite3 db) 在 Microsoft.Data.Sqlite.SqliteConnectionInternal.RetryWhileBusy(Func

1 action, Action reset, Int32 timeout, Stopwatch timer) at Microsoft.Data.Sqlite.SqliteConnectionInternal.RetryWhileBusy(Func
1 操作,Int32 超时,秒表计时器) 在 Microsoft.Data.Sqlite.SqliteConnectionInternal.ExecuteNonQuery(字符串 sql,Int32 超时) 在 Microsoft.Data.Sqlite.SqliteConnectionInternal..ctor(SqliteConnectionStringBuilder 连接选项,SqliteConnectionPool 池) 在 Microsoft.Data.Sqlite.SqliteConnectionPool.GetConnection() 在 Microsoft.Data.Sqlite.SqliteConnectionFactory.GetConnection(SqliteConnection 外连接) 在 Microsoft.Data.Sqlite.SqliteConnection.Open() 在 Microsoft.EntityFrameworkCore.Sqlite.Scaffolding.Internal.SqliteDatabaseModelFactory.Create(DbConnection 连接,DatabaseModelFactoryOptions 选项) 在 Microsoft.EntityFrameworkCore.Sqlite.Scaffolding.Internal.SqliteDatabaseModelFactory.Create(字符串连接字符串,DatabaseModelFactoryOptions 选项) 在Microsoft.EntityFrameworkCore.Scaffolding.Internal.ReverseEngineerScaffolder.ScaffoldModel(字符串connectionString,DatabaseModelFactoryOptions数据库选项,ModelReverseEngineerOptions modelOptions,ModelCodeGenerationOptions codeOptions) 在Microsoft.EntityFrameworkCore.Design.Internal.DatabaseOperations.ScaffoldContext(字符串提供程序,字符串connectionString,字符串outputDir,字符串outputContextDir,字符串dbContextClassName,IEnumerable
1 schemas, IEnumerable
1表,字符串modelNamespace,字符串contextNamespace,布尔useDataAnnotations,布尔overwriteFiles,布尔useDatabaseNames,布尔抑制OnConfiguring,布尔noPluralize) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(字符串提供程序,字符串连接字符串,字符串outputDir,字符串outputDbContextDir,字符串dbContextClassName,IEnumerable
1 schemaFilters, IEnumerable
1 tableFilters,字符串modelNamespace,字符串contextNamespace,布尔useDataAnnotations,布尔overwriteFiles,布尔useDatabaseNames,布尔suppressOnConfiguring , 布尔值非复数) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContext.<>c__DisplayClass0_0.<.ctor>b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作操作) SQLite 错误 26:“文件不是数据库”。

c# sqlite entity-framework-core dbcontext ef-database-first
1个回答
0
投票

我在项目中添加的库:

  • Microsoft.EntityFrameworkCore.Sqlite,
  • Microsoft.EntityFrameworkCore.Tools,
  • SQLitePCLRaw.bundle_e_sqlcipher,
  • Microsoft.EntityFrameworkCore.Sqlite.Design

首先,你不能混合

Microsoft.EntityFrameworkCore.Sqlite
SQLitePCLRaw.bundle_e_sqlcipher
。它们都包含本机 SQLite 库。请改用
Microsoft.EntityFrameworkCore.Sqlite.Core
SQLitePCLRaw.bundle_e_sqlcipher
。核心包不包含本机库,因此肯定会使用来自bundle_e_sqlcipher 的库。

第二,不要安装

Microsoft.EntityFrameworkCore.Sqlite.Design
。该软件包适用于七年前发布的 EF Core 1.0。您应该已经看到此软件包已弃用的警告。

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