如何在执行 'database-update' 命令时访问 Web 根目录之外的 .txt 文件?

How to access a .txt file outside of the web root when doing a 'database-update' command?

在基于 Web 的应用程序中,我需要访问保存在 Web 项目外部的 .txt 文件(所以它的路径(我相信?)是不可能的)。最终目标是使用 .txt 文件为数据库做种。

我想过去我曾见过在哪里可以像访问 class 一样访问 .txt 文件,类似这样...

(一张图片值1k字)...

但是,resourceName 最终为空。

这可能吗?我不想对文件的完整路径进行硬编码,因为它在其他开发人员的工作站上会有所不同,等等。最好的方法是什么?

我也试过了...

const string resourceName = "~/SeedData/ZipCodeStates.txt";

const string resourceName = "SeedData/ZipCodeStates.txt";

这是堆栈跟踪...

   at System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean leaveOpen)
   at System.IO.StreamReader..ctor(Stream stream)
   at xxxxxEventLink.Data.Migrations.Configuration.AddOrUpdateZipCodeStates(IReadOnlyCollection`1 dbZipCodeStates) in C:\TFS\Workspaces\EventLink\xxxxx\xxxxxEventLink\Web\Main\xxxxxEventLink.Data\Migrations\Configuration.cs:line 57
   at xxxxxEventLink.Data.Migrations.Configuration.Seed(ApplicationDbContext context) in C:\TFS\Workspaces\EventLink\xxxxx\xxxxxEventLink\Web\Main\xxxxxEventLink.Data\Migrations\Configuration.cs:line 44
   at System.Data.Entity.Migrations.DbMigrationsConfiguration`1.OnSeed(DbContext context)
   at System.Data.Entity.Migrations.DbMigrator.SeedDatabase()
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase()
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)

你有几个选择,你可以:

  • 使用当前程序集位置的相对路径: Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"..\..\Etc");
    如果这样做,将文本文件设置为复制到输出目录可能也是一个好主意,这样您就不需要通过 bin 目录向上爬.
  • 将文本文件作为嵌入资源嵌入。右键单击该文件并将构建操作设置为嵌入式资源,然后您可以通过以下方式访问它: Assembly.GetExecutingAssembly().GetManifestResourceStream("...")
    如果你不知道在 ... 部分放什么,你可以通过查看结果来检查: Assembly.GetExecutingAssembly().GetManifestResourceNames();