我遵循了关于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'的表:
SQLite是否需要对代码进行其他更改,或者这是Entity Framework的SQLite连接器中的错误?
答案 0 :(得分:9)
EF实际上正在打开的数据库很可能不是您在数据库浏览器中打开的文件。 SQLite使用进程当前工作目录,如果在IIS或其他服务器中启动,则可以是与源代码目录不同的文件夹。 (请参阅问题https://github.com/aspnet/Microsoft.Data.Sqlite/issues/132和https://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();
它在我的新Azure托管站点上创建了一个新数据库,因此,如果您要迁移大量现有数据,则将无法使用。它对我有用,所以我想分享。
答案 4 :(得分:0)
来自EF Core文档...
从Visual Studio运行
要从Visual Studio运行此示例,必须设置 手动将目录作为项目的根目录。如果您不设置 工作目录,下面是Microsoft.Data.Sqlite.SqliteException 引发:SQLite错误1:“没有这样的表:博客”。
设置工作目录: