2016-05-05 226 views
3

在基于ASP.NET Core(以前的ASP.NET 5),.NET Core CLR RC1,EF Core(以前的EF 7),启用EF Migrations,LocalDb v11.0的Web项目中使用VS2015。如何在ASP.NET Core中设置正确的AttachDbFilename相对路径?

我手动(通过SQL命令)创建的数据库,并放置MDF/LDF文件项目中的子目录,类似的情况:

MySolution\src\MyProject\MyLocalData\ 
    - MyLocalDb.mdf 
    - MyLocalDb_log.ldf 

这是"ConnectionString"密钥集的在appsettings.json的值(或在至少,在众多的一个我想):

"Data Source=(LocalDb)\\v11.0;AttachDbFilename=.\\MyLocalData\\MyLocalDb.mdf;Integrated Security=True" 

初始迁移已正确创建,现在我被困在dnx ef database update命令(见official tutorial),这给了这个错误:

Error Number:15350,State:1,Class:14 An attempt to attach an auto-named database for file .\MyLocalData\MyLocalDb.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

我敢肯定,有没有其他数据库使用该名称,在我的用户主目录已经检查了这两个文件,并在SQL Server Management Studio中对LocalDB实例数据库。事实上,如果我切换到AttachDbFilename中的绝对文件路径,迁移将进一步移动(并通过EF流畅接口查找与列属性相关的其他错误,但这是另一回事)。

所以它在我看来这是所有的问题找到合适的相对路径使用AttachDbFilename。我在SO搜索相关主题,但找不到任何答案。我也尝试更改相对路径,想象当前的文件夹是wwwrootartifacts文件夹,但没有运气。

有没有人知道如何正确设置? TA

回答

6

我现在有这个工作,这是艰苦的工作。 这里的关键是环境信息的“ContentRootPath”,这在你的榜样将返回路径MySolution的\ src \ MyProject的

我的测试应用程序是以下 https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html

与变化,包括了“数据库优先”教程这样一来适合我教学的web应用程序的编程和需要自己的情况包含在我和学生可以在对方的机器上讨论运行的应用程序,这标志着等

在appsettings.json

{ 
    "ConnectionStrings": { 
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;AttachDBFilename=%CONTENTROOTPATH%\\App_Data\\blogging.mdf;Trusted_Connection=true;MultipleActiveResultSets=true" 
    } 

凭借独特的部分是:

AttachDBFilename=%CONTENTROOTPATH%\\App_Data\\blogging.mdf 

确定我使用的是传统的名为“App_Data文件”,但它是ContentRootPath下更安全,而不是在“wwwroot的”。

然后在Startup.cs

public class Startup 
{ 
    //20160718 JPC enable portable dev database 
    private string _contentRootPath = ""; 

    public Startup(IHostingEnvironment env) 
    { 
     //20160718 JPC enable portable dev database 
     _contentRootPath = env.ContentRootPath; 
    ... 
    } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     //20160718 JPC enable portable dev database 
     string conn = Configuration.GetConnectionString("DefaultConnection"); 
     if(conn.Contains("%CONTENTROOTPATH%")) 
     { 
      conn = conn.Replace("%CONTENTROOTPATH%", _contentRootPath); 
     } 
     ... 
    } 

在上述 “...” 表示由Visual Studio 2015生成的标准代码。请注意,当我们“发布”这样的应用时,我们需要将自定义文件夹和文件(例如我的“App_Data”文件夹)手动复制并粘贴到发布的版本中。或者,我们可以将自定义文件夹名称(在本例中为“App_Data”)添加到文件“project.json”中。

对于任何包括控制器类的类,我们都可以添加一个带参数env的构造方法,宿主环境将为我们提供有用的信息,包括ContentRootPath。用于自定义文件存储,例如为我们的用户提供文件上传。

public class HomeController : Controller 
{ 
    //20160719 JPC access hosting environment via controller constructors 
    private IHostingEnvironment _env; 

    public HomeController(IHostingEnvironment env) 
    { 
     _env = env; 
    } 

    public IActionResult Index() 
    { 
     string contentRootPath = _env.ContentRootPath; 
     return View(); 
    } 

确定这只是演示的原则为我加上断点“返回查看()”,然后将鼠标悬停在contentRootPath做出点。

ASP.NET Core MVC6看起来像是我遇到的更大的学习和教学挑战之一。祝大家好运。我发现了一个不错的进步:在MVC5中,我们有一些戏剧让我们的自定义数据和身份AspNetUser表格很好地一起生活在一个数据库中。看起来它在MVC6中是一个更简洁和整洁的命题。

+0

感谢您的详尽解答。我已经放弃了将开发数据库文件本地化到项目中的想法,并将其转移到“标准”情况下让他们在堆栈决定的位置(我的用户文件夹)创建它们。无论如何,我们正在迁移(以及developmnet中的数据种子),所以我们可以轻松地从头开始重新创建相同的数据库和数据。 – superjos

+0

注意:我没有在实践中尝试过,但自1.0 RTM'project.json'提供了一个'publishOptions'字段,其中包含一个嵌套的'include'字段,您可以在其中列出相对路径/球体到应该是文件和文件夹发布时考虑。也许尝试使用''publishOptions':{“include”:[“App_Data”,“wwwroot”,“Views”,“appsettings.json”,“web.config”]} – superjos

+0

谢谢@superjos for“ :“我现在已经尝试过了(将自定义文件夹添加到'project.json')并且工作正常。我已更新该帖子。部署到网络服务器已经工作,但没有与localdb - 我不得不去常规的SQL Server与附加数据库。使用部署的主要发现是安装ASP.NET Core 1.0 webserver软件包后需要完全重新启动Web服务器。 – iafilm

1

我发现周围

  1. 更简单的方式运行你的应用程序,并在默认位置

  2. 打开的Microsoft SQL Server Management Studio中创建的数据库(或你喜欢的IDE),并创建一个新的连接指(的LocalDB)\ mssqllocaldb

  3. 脚本数据库作为CREATE

  4. 变化在文件名中的路径

  5. 删除DB你在步骤1中创建(选择关闭现有的连接)

  6. 运行脚本

你的应用程序,而不在配置

改变任何东西应该工作
相关问题