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

nzkunb0c  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(216)

我使用的是. NET Core版本7,我想使用EF Core访问一个Sqlite(*.db3)数据库文件。这个文件有一个密码,我想通过数据库添加数据库表到项目第一。scaffold-dbcontext代码如下所示,但它给出了一个错误,并且没有带来表。有什么问题吗?

    • 一般来说,SQlite数据库表可以通过DatabaseFirst添加到项目中,或者应该只通过CodeFirst添加,因为我搜索的所有地方都是通过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。异常(0x80004005):第26章:你是谁"文件不是数据库"。在微软。数据。SQLite。SqliteException。ThrowExceptionForRC(Int32 rc,sqlite3 db).数据。SQLite。SqliteConnectionInternal。Microsoft的RetryWhileBusy(函数1 action, Action reset, Int32 timeout, Stopwatch timer) at Microsoft.Data.Sqlite.SqliteConnectionInternal.RetryWhileBusy(Func 1操作,Int32超时,秒表计时器)。数据。SQLite。SqliteConnectionInternal。ExecuteNonQuery(String sql,Int32 timeout)at Microsoft.Data.Sqlite.SqliteConnectionInternal.. ctor(SqliteConnectionStringBuilder connectionOptions,SqliteConnectionPool池)。数据。SQLite。SqliteConnectionPool。GetConnection()在Microsoft。数据。SQLite。SqliteConnectionFactory。Microsoft的GetConnection(SqliteConnection outerConnection)。数据。SQLite。SqliteConnection。在Microsoft中打开()。安全框架核心。SQLite。脚手架内部。SqliteDatabaseModelFactory。在Microsoft中创建(DbConnection连接,DatabaseModelFactoryOptions选项)。安全框架核心。SQLite。脚手架内部。SqliteDatabaseModelFactory。在Microsoft中创建(String connectionString,DatabaseModelFactoryOptions选项)。安全框架核心。脚手架内部。逆向工程脚手架。ScaffoldModel(String connectionString,DatabaseModelFactoryOptions databaseOptions,ModelReverseEngineerOptions modelOptions,ModelCodeGenerationOptions codeOptions)在Microsoft。安全框架核心。设计。内部。数据库操作。ScaffoldContext(String provider,String connectionString,String outputDir,String outputContextDir,String dbContextClassName,IEEE8021 schemas, IEnumerable 1 tables,String modelpace,String contextpace,Boolean useDataAnnotations,Boolean overwriteFiles,布尔值useDatabaseNames、布尔值suppressOnConfiguring、布尔值noPluralize)。安全框架核心。设计。执行者行动ScaffoldContextImpl(String provider,String connectionString,String outputDir,String outputDbContextDir,String dbContextClassName,IEEE8021 schemaFilters, IEnumerable 1 tableFilters,String modelpace,String contextpace,布尔值useDataAnnotations、布尔值overwriteFiles、布尔值useDatabaseNames、布尔值suppressOnConfiguring、布尔值noPluralize)。<> c__DisplayClass0_0。<.ctor>b__0()位于Microsoft.Microsoft.FrameworkCore.Design.OperationExecutor.OperationBase.<> c__DisplayClass3_0 `1.b__0()位于Microsoft. MicrosoftFrameworkCore. Design. OperationExecutor. OperationBase. Execute(操作操作)SQLite错误26:"文件不是数据库"。

jhdbpxl9

jhdbpxl91#

我在项目中添加的库:

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

首先,不能混合使用Microsoft.EntityFrameworkCore.SqliteSQLitePCLRaw.bundle_e_sqlcipher。它们都包含原生SQLite库。使用Microsoft.EntityFrameworkCore.Sqlite.CoreSQLitePCLRaw.bundle_e_sqlcipher代替。核心包不包括本机库,所以bundle_e_sqlcipher中的库肯定会被使用。
第二,不要安装Microsoft.EntityFrameworkCore.Sqlite.Design。这个软件包是七年前发布的EF Core 1.0。您应该已经看到了此软件包已被弃用的警告。

相关问题