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'的表:
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/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"); });
}
}
Run Code Online (Sandbox Code Playgroud)
我在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 数据库,并且该数据库将根据我的实体自动创建架构。
看起来事情发生了变化,因为 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)