如何在执行 '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();
在基于 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();