gpt4 book ai didi

c# - 如何在 ASP.NET Core 中设置正确的 AttachDbFilename 相对路径?

转载 作者:太空狗 更新时间:2023-10-29 22:18:36 25 4
gpt4 key购买 nike

在 VS2015 中处理基于 ASP.NET Core(以前的 ASP.NET 5)、.NET Core CLR RC1、EF Core(以前的 EF 7)、启用 EF 迁移、LocalDb v11.0 的 Web 项目。

我手动(通过SQL命令)创建了一个数据库,并将MDF/LDF文件放在项目子目录下,情况类似于:

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

这是在 appsettings.json 中设置的 "ConnectionString" 键的值(或者至少是我尝试过的许多方法之一):

"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 中使用的正确相对 路径的问题。我在这里搜索相关主题,但找不到任何答案。我还尝试更改相对路径,假设 current 文件夹是 wwwrootartifacts 文件夹,但没有成功。

有人知道如何正确设置吗?助教

最佳答案

我现在确实有这个工作,这是一项艰苦的工作。关键是环境信息“ContentRootPath”,在您的示例中,它将返回 MySolution\src\MyProject 的路径

我的测试应用程序是下面的“数据库优先”教程 https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html

包括这个变化,以适应我教授网络应用程序编程和需要独立应用程序的情况,我和学生可以在彼此的机器上运行以进行讨论、标记等。

在 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”。

同样值得一提的是,对于包括 Controller 类在内的任何类,我们都可以添加一个带有参数 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();
}

好吧,这只是为了演示原理,因为我在“return View()”上添加了一个断点,然后将鼠标悬停在 contentRootPath 上以说明这一点。

ASP.NET Core MVC6 看起来像是我遇到的更大的学习和教学挑战之一。祝我们所有人好运。我发现了一个很好的进步:在 MVC5 中,我们发生了一些戏剧性的事情,让我们的自定义数据和身份 AspNetUser 表在一个数据库中很好地共存。看起来它正在成为 MVC6 中更整洁的命题。

关于c# - 如何在 ASP.NET Core 中设置正确的 AttachDbFilename 相对路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37058684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com