【问题标题】:SQLite Error 14: 'unable to open database file' with EF Core code firstSQLite 错误 14:“无法打开数据库文件”首先使用 EF Core 代码
【发布时间】:2017-10-29 03:59:57
【问题描述】:

我得到一个

SQLite 错误 14:“无法打开数据库文件”

首先使用 EF Core 代码,不知道为什么。我第一次工作得很好,数据库文件是在 c:\users\username\AppData\Local\Packages\PackageId\LocalState 中创建的。

然后我删除了数据库文件和代码优先迁移和 ModelSnapshot 类并创建了一个新迁移(我在应用程序启动时调用 DbContext.Database.Migrate() 以自动执行它们)。现在无法再次创建数据库。

【问题讨论】:

    标签: sqlite ef-code-first entity-framework-core


    【解决方案1】:

    我认为问题在于 EntityFramework Core 在使用 SQLite 提供程序时无法自行创建文件夹。不知道使用其他基于文件的数据库提供程序时是否也会出现此问题。

    我遇到了同样的问题:
    我的数据源是这样的: optionsBuilder.UseSqlite(@"Data Source=c:\foo_db\bar_db.db");

    在我在 c:\ 驱动器中创建 "foo_db" 文件夹后,问题得到解决,EF Core 在文件夹中创建了 .db 文件。

    【讨论】:

      【解决方案2】:

      解决了。

      1. 激活“中断所有异常”(在异常设置窗口中)导致奇怪的“无法打开数据库文件”异常。

      2. 删除实体类上的 [Table("TableName")] 属性会导致迁移类中出现一些奇怪的表创建行为。我认为该属性只需要创建一个名称不同于类名的表。

      【讨论】:

      • 我相信 #2 与它无关。这不是问题(或错误)。您删除了数据库。当您调用 Migrate(甚至是 EnsureCreated)时,EF 需要确定数据库是否已经存在(以便它可以在不存在时创建一个)。 EF 通过连接到数据库来做到这一点。如果成功则数据库存在,如果失败则不存在。由于您对所有异常都有中断,因此当您在连接到数据库时遇到异常时,它会破坏代码。如果您继续执行,那么 EF 将捕获异常并为您创建数据库。
      【解决方案3】:

      我还通过将项目文件 (*.csproj) 中的“InProcess”替换为“OutOfProcess”来解决了这个问题。希望对你也有帮助。

      【讨论】:

      【解决方案4】:

      实际问题是在迁移和数据库更新后 *.db 文件不会自动进入 bin 文件夹。 您只需要选择 *.db 并更改属性“复制到输出目录”=“如果较新则复制”。 这将解决问题。请尝试告诉我们。

      【讨论】:

        【解决方案5】:

        截至 2019 年 8 月仍在发生。尝试了以上所有方法,但在 2 小时后对我的修复是这样的:

        在应用程序的任何地方添加这个类:

        internal class CurrentDirectoryHelpers
        {
            internal const string AspNetCoreModuleDll = "aspnetcorev2_inprocess.dll";
            [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            private static extern IntPtr GetModuleHandle(string lpModuleName);
            [System.Runtime.InteropServices.DllImport(AspNetCoreModuleDll)]
            private static extern int http_get_application_properties(ref IISConfigurationData iiConfigData);
            [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
            private struct IISConfigurationData
            {
                public IntPtr pNativeApplication;
                [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.BStr)]
                public string pwzFullApplicationPath;
                [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.BStr)]
                public string pwzVirtualApplicationPath;
                public bool fWindowsAuthEnabled;
                public bool fBasicAuthEnabled;
                public bool fAnonymousAuthEnable;
            }
            public static void SetCurrentDirectory()
            {
                try
                {
                    // Check if physical path was provided by ANCM
                    var sitePhysicalPath = Environment.GetEnvironmentVariable("ASPNETCORE_IIS_PHYSICAL_PATH");
                    if (string.IsNullOrEmpty(sitePhysicalPath))
                    {
                        // Skip if not running ANCM InProcess
                        if (GetModuleHandle(AspNetCoreModuleDll) == IntPtr.Zero)
                        {
                            return;
                        }
                        IISConfigurationData configurationData = default(IISConfigurationData);
                        if (http_get_application_properties(ref configurationData) != 0)
                        {
                            return;
                        }
                        sitePhysicalPath = configurationData.pwzFullApplicationPath;
                    }
                    Environment.CurrentDirectory = sitePhysicalPath;
                }
                catch
                {
                    // ignore
                }
            }
        }
        

        然后,首先在 Program.cs 中调用它,如下所示:

        public static void Main(string[] args)
        {
            CurrentDirectoryHelpers.SetCurrentDirectory();
            CreateWebHostBuilder(args).Build().Run();
        }
        

        我的设置

        • AspNet Core 2.2 Web API
        • EF Core SQLite 2.2.6
        • 连接字符串设置为"Filename=./mydatabase.db"

        学分

        我从这篇文章中得到它: https://elanderson.net/2019/02/asp-net-core-configuration-issue-with-in-process-hosting/

        【讨论】:

          【解决方案6】:

          我处于同样的情况,我的问题通过像图片一样向下移动来解决:

          首先"AllowedHosts": "*",和他们

          "ConnectionStrings": {
              "DefaultConnection": "DbExample"
            }
          

          NetCore 2.1 版本发生在我身上我希望这可以帮助你:)

          【讨论】:

            【解决方案7】:

            您可以在 DbContext 类中尝试此代码:

              protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder)
                {
                    var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "YourDbName.db");
                    optionsBuilder.UseSqlite("Filename = "+dbPath);
                    base.OnConfiguring(optionsBuilder);
                }
            

            【讨论】:

              【解决方案8】:

              在我的情况下,Windows 10 勒索软件保护阻止 LINQPad.DriverProxy.LINQPad.Drivers.EFCore.exe 访问该文件。在勒索软件保护下允许它 -> 阻止历史记录可以防止引发此错误。

              【讨论】:

                【解决方案9】:

                这对我有用:

                    static SqliteConnection CreateConnection()
                    {
                        string dbPath = Environment.CurrentDirectory + @"\Database.sqlite";
                        SqliteConnection conn = new SqliteConnection(@"Data Source = " + dbPath);
                        try
                        {
                            conn.Open();
                        }
                        catch { }
                        return conn;
                    }
                

                【讨论】:

                  【解决方案10】:

                  当使用像 IIS 这样的 Web 服务器时,确保允许用于运行应用程序的用户(例如,对于 IIS 可以成为application pool identity)。

                  【讨论】:

                    猜你喜欢
                    • 2015-02-16
                    • 1970-01-01
                    • 2020-07-03
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-09-13
                    相关资源
                    最近更新 更多