我在项目中使用Entity Framework代码进行首次迁移。其中一个迁移通过从位于项目目录中的def foo(sub, lst):
'''Checks if sub is in lst.
Expects both arguments to be lists
'''
if len(lst) < len(sub):
return False
return sub == lst[:len(sub)] or foo(sub, lst[1:])
文件中读取数据来填充数据库表。项目结构如下所示:
csv
在我的- Soulution
- Project
- Migrations
- CSVFolder
- file1.csv
- file2.csv
- Migration1.cs
- Migration2.cs
方法中,我得到这样的文件:
Up()
这在我的开发机器上运行正常,但是当我使用Octopus将其部署到测试服务器时,我得到一条未找到路径的异常
无法找到路径的一部分 'C:\八达通\应用\测试\解\ 1.1- alpha21 \迁移\ CSVFolder'
我检查了'drop'文件夹,其中的输出包含public override void Up()
{
var migrationsDir = AppDomain.CurrentDomain.BaseDirectory + "/Migrations/CSVFolder/"; // For some reason, Path.Combine() doesn't work for me here so I manually concatenate the strings.
var templateFiles = Directory.GetFiles(migrationsDir, "*.csv");
foreach (var filename in templateFiles)
{
Sql(); // SQL Insert statement here.
}
}
。
我尝试了几种不同的方法来获取文件夹的路径,但它们可以在本地或服务器上运行。获取本地和服务器上的路径的最佳方法是什么?
答案 0 :(得分:2)
您必须正确设置路径!如果测试测试运行器目录,AppDomain.CurrentDomain.BaseDirectory
将返回,在应用程序模式下,您将获得.. \ Bin \ Debug等。您必须检查您有多少目录,直到您可以到达所需位置(CSVFolder)然后替换路径或更改它,例如:
var migrationsDir = AppDomain.CurrentDomain.BaseDirectory + "../../Migrations/CSVFolder/"; // For some reason, Path.Combine() doesn't work for me here so I manually concatenate the strings.
你已经注意到你要做的事情并不容易,所以你可以忘记这个问题,这就是诀窍。最好的方法是将cvs文件附加到程序集资源!在迁移过程中,您可以访问它们,如下所示:
在Up()
中var file1 = Properties.Resources.File1;
此方法将保证Sql或Cvs文件始终在运行时附加/加载到程序集。
答案 1 :(得分:0)
这对我有用
AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory