【问题标题】:Use the same EF database path in EF Core 1.1 and 2.0在 EF Core 1.1 和 2.0 中使用相同的 EF 数据库路径
【发布时间】:2018-02-07 18:53:24
【问题描述】:

我的 EF Core 1.1 和 ASP.NET Core 1.1 应用程序在 MySolution/MyProject/bin/[Debug|Release]/netcoreapp1.1/MyDatabase.db(我认为这是默认设置)中寻找其 SQLite 数据库。我的迁移在该路径中创建/迁移了数据库,一切正常。

我正在尝试升级到 netcoreapp2.0,但我的迁移仍会写入该目录。但在运行时,应用程序会在 MySolution/MyProject/ 中查找数据库,而不是 bin 路径。所以当然失败了。

如何恢复之前的行为?

【问题讨论】:

  • 显示一些代码,会有帮助的
  • @tchelidze 什么代码?我从未在任何地方指定路径。所以我希望升级到 2,0 的行为方式相同,
  • “MyDatabase.db”名称未内置到 asp.net core 中,您将在某处指定它。
  • @tchelidze 是的,这是在appsettings.json 中完成的,它有"ConnectionStrings": { "DefaultConnection": "Filename=MyDatabase.db" },虽然我也没有改变任何东西:(

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


【解决方案1】:

这是 EF Core 2.0 中的一项重大更改(问题 #7588)。您应该将数据库文件移动到您的项目中并指定复制到输出目录

【讨论】:

  • 谢谢布莱斯!你觉得我下面的解决方案怎么样?它对我有用(虽然我没有在生产中测试),但是它有什么陷阱可以让你的推荐更好/更安全吗?例如使用AppContext.BaseDirectory 是否安全,或者我应该使用IHostingEnvironment 或类似的东西?
  • 三思而后行......该应用正在寻找应用目录中的数据库(appsettings.json 文件的位置)。我的问题是 db 已经位于 bin/output 目录中,但应用程序没有在其中查找...
【解决方案2】:

感谢@bricelam 对related issue 的建议,可以这样做:

services.AddDbContext<MyDbContext>(
  options => {
    var builder = new SqliteConnectionStringBuilder(_configuration.GetConnectionString("DefaultConnection"));
    builder.DataSource = Path.Combine(AppContext.BaseDirectory, builder.DataSource);
    options.UseSqlite(builder.ToString());
  },
  ServiceLifetime.Scoped);

我在开发中对此进行了测试,但我不确定它在生产中是否有效,或者AppContext.BaseDirectory 是否可以安全使用(而不是IHostingEnvironment 或类似的东西)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多