ASP.NET 5,EF 7和SQLite - SQLite错误1:'没有这样的表:博客'

Art*_*ump 13 asp.net sqlite entity-framework entity-framework-core asp.net-core

我遵循了关于Entity Framework 7的ASP.NET 5入门指南,我用Sqlite替换了MicrosoftSqlServer,代码的唯一区别在于Startup.cs:

services.AddEntityFramework()
    .AddSqlite()
    .AddDbContext<BloggingContext>(options => options.UseSqlite("Filename=db.db"));
Run Code Online (Sandbox Code Playgroud)

当我运行网站并导航到/ Blogs时,我收到一个错误:

Microsoft.Data.Sqlite.SqliteException是由用户代码未处理的
错误码= -2147467259的HResult = -2147467259消息= SQLite的错误1: '没有这样的表:博客'源= Microsoft.Data.Sqlite
SqliteErrorCode = 1个堆栈跟踪:在Microsoft.Data. Sqlite.Interop.MarshalEx.ThrowExceptionForRC(RC的Int32,Sqlite3Handle DB)在Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(的CommandBehavior行为)在Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReader(的CommandBehavior行为)在System.Data.Common.DbCommand .ExecuteReader()在Microsoft.Data.Entity.Query.Internal.QueryingEnumerable.Enumerator.MoveNext()在System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()在System.Linq.Enumerable.d__1`2.MoveNext()在System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()在Microsoft.Data.Entity.Query.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()在System.Collections.Generic.List`1..ctor(IEnumerable` 1个集合)在System.Linq.Enumerable.ToList [TSo urce]在d(IEnumerable`1源)在EFGetStarted.AspNet5.Controllers.BlogsController.Index():\阿瑟\文件\视觉工作室2015 \项目\ EFGetStarted.AspNet5\SRC\EFGetStarted.AspNet5 \控制器\ BlogsController.cs: regel 18 InnerException:

我理解这就好像没有名为'Blog'的表,但是当我在DB Browser for SQLite中打开.db文件时,实际上有一个名为'Blog'的表:

DB Browser for SQLite的屏幕截图显示了一个名为'Blog'的表格

SQLite是否需要对代码进行其他更改,或者这是Entity Framework的SQLite连接器中的错误?

Mic*_*ael 17

我这样做了,但仍然无法加载数据库。我在数据库上下文的构造函数中添加了以下代码: Database.EnsureCreated();


现在我的上下文文件如下所示: 棋盘游戏数据库上下文文件

它在我的新 Azure 托管站点上创建了一个新数据库,因此如果您有大量现有数据要迁移,这将不起作用。它对我有用,所以我想我会分享。


jjo*_*lon 14

取自 EF Core 文档...

从 Visual Studio 运行

要从 Visual Studio 运行此示例,您必须手动将工作目录设置为项目的根目录。如果不设置工作目录,则会抛出以下 Microsoft.Data.Sqlite.SqliteException:SQLite 错误 1:'没有这样的表:博客'。

设置工作目录:

  • 解决方案资源管理器中,右键单击该项目,然后选择属性
  • 在左窗格中选择调试选项卡。
  • 工作目录 设置为项目目录。
  • 保存更改。


nat*_*ter 11

EF实际上正在打开的数据库很可能不是您在数据库浏览器中打开的文件.SQLite使用进程当前工作目录,如果在IIS或其他服务器中启动,则可以是与源代码目录不同的文件夹.(参见问题https://github.com/aspnet/Microsoft.Data.Sqlite/issues/132https://github.com/aspnet/Microsoft.Data.Sqlite/issues/55).

要确保您的db文件位于正确的位置,请使用绝对路径.例:

public class Startup
{
    private IApplicationEnvironment _appEnv;

    public Startup(IApplicationEnvironment appEnv)
    {
        _appEnv = appEnv;
    }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlite()
            .AddDbContext<MyContext>(
                options => { options.UseSqlite($"Data Source={_appEnv.ApplicationBasePath}/data.db"); });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 还要确保 - 特别是如果您像我一样在跨平台环境中工作 - 您使用 unix 或 windows 文件路径约定。在 Windows 上,您的程序可能会读取带有“\\”的路径,例如“/”,但在 Linux 上,“\\”可能无法读取您的文件。来自 EF Core 的错误消息只是误导性的:) (2认同)

use*_*608 8

我在netcoreapp2.0. 有一个相关的问题可能有问题,但我不想通过每晚构建来解决它。

我的解决方案是创建并传递一个SqliteConnection而不是使用构建器字符串。

所以对于这个设置:

string id = string.Format("{0}.db", Guid.NewGuid().ToString());

var builder = new SqliteConnectionStringBuilder()
{
    DataSource = id,
    Mode = SqliteOpenMode.Memory,
    Cache = SqliteCacheMode.Shared
};
Run Code Online (Sandbox Code Playgroud)

像这样为 DI 编写:

var connection = new SqliteConnection(builder.ConnectionString);
connection.Open();
connection.EnableExtensions(true);
services.AddDbContext<SomeDbContext>(options => options.UseSqlite(connection));
Run Code Online (Sandbox Code Playgroud)

我的错误是使用这种风格的初始化:

services.AddDbContext<SomeDbContext>(options => options.UseSqlite(builder.ConnectionString));
Run Code Online (Sandbox Code Playgroud)

我的脚手架也有一个一次性调用:

var dbContext = serviceScope.ServiceProvider.GetService<SomeDbContext>();
dbContext.Database.OpenConnection();
dbContext.Database.EnsureCreated();
Run Code Online (Sandbox Code Playgroud)

使用这种方法,我所有的 DI 实例化副本都SomeDbContext将指向一个有效的 SQLite 数据库,并且该数据库将根据我的实体自动创建架构。

  • 在我的例子中,最后一个片段是这个问题的真正关键。SQLite 连接的行为与我使用的其他连接不同。 (2认同)

T B*_*own 6

看起来事情发生了变化,因为 IApplicationEnvironment 已被 IHostingEnvironment 取代。

删除 IApplicationEnvironment \ IRuntimeEnvironment

public class Startup
{
    private IHostingEnvironment _appHost;

    public Startup(IHostingEnvironment appHost)
    {
        _appHost = appHost;
    }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFrameworkSqlite()
            .AddDbContext<MyContext>(
                options => { options.UseSqlite($"Data Source={_appHost.ContentRootPath}/data.db"); });
    }
}
Run Code Online (Sandbox Code Playgroud)