我正在使用 .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 操作,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,IEnumerable1 action, Action reset, Int32 timeout, Stopwatch timer) at Microsoft.Data.Sqlite.SqliteConnectionInternal.RetryWhileBusy(Func
1表,字符串modelNamespace,字符串contextNamespace,布尔useDataAnnotations,布尔overwriteFiles,布尔useDatabaseNames,布尔抑制OnConfiguring,布尔noPluralize) 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(字符串提供程序,字符串连接字符串,字符串outputDir,字符串outputDbContextDir,字符串dbContextClassName,IEnumerable1 schemas, 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:“文件不是数据库”。1 schemaFilters, IEnumerable
我在项目中添加的库:
- 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。您应该已经看到此软件包已弃用的警告。