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

时间:2015-10-31 18:22:14

标签: asp.net entity-framework sqlite asp.net-core entity-framework-core

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

services.AddEntityFramework()
    .AddSqlite()
    .AddDbContext<BloggingContext>(options => options.UseSqlite("Filename=db.db"));

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

  

Microsoft.Data.Sqlite.SqliteException未被用户代码
处理   ErrorCode = -2147467259 HResult = -2147467259 Message = SQLite Error 1:   '没有这样的表:博客'来源= Microsoft.Data.Sqlite
  SqliteErrorCode = 1 StackTrace:          在Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc,   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 [TSource](IEnumerable`1 source)          在d:\ arthur \ documents \ visual studio中的EFGetStarted.AspNet5.Controllers.BlogsController.Index()   2015年\项目\ EFGetStarted.AspNet5的\ src \ EFGetStarted.AspNet5 \ \控制器BlogsController.cs:葱   18 InnerException:

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

Screenshot from DB Browser for SQLite showing a table called 'Blog'

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

5 个答案:

答案 0 :(得分:9)

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"); });
    }
}

答案 1 :(得分:4)

看起来事情已经改变,因为IApplicationEnvironment已被IHostingEnvironment取代。

Removing 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"); });
    }
}

答案 2 :(得分:2)

我在netcoreapp2.0上遇到了这个问题。有一个相关的issue可能有错,但我不想通过每晚的构建解决它。

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

所以对于这个设置:

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

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

像这样编写DI:

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

我遇到的错误是使用这种样式的init:

services.AddDbContext<SomeDbContext>(options => options.UseSqlite(builder.ConnectionString));

我的脚手架也有一次性电话:

var dbContext = serviceScope.ServiceProvider.GetService<SomeDbContext>();
dbContext.Database.OpenConnection();
dbContext.Database.EnsureCreated();

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

答案 3 :(得分:2)

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


现在我的上下文文件如下:BoardGameDBContextFile

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

答案 4 :(得分:0)

来自EF Core文档...

从Visual Studio运行

  

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

设置工作目录:

  • Solution Explorer 中,右键单击项目,然后选择 Properties
  • 在左窗格中选择 Debug 标签。
  • 工作目录设置为项目目录。
  • 保存更改。