2016-08-11 33 views
2

我在我的項目中使用實體框架代碼第一次遷移。其中一種遷移通過讀取位於項目目錄中的csv文件中的數據來填充數據庫表。項目結構如下所示:從EF遷移腳本中查找目錄路徑的最佳方法是什麼?

- Soulution 
    - Project 
     - Migrations 
     - CSVFolder 
      - file1.csv 
      - file2.csv 
     - Migration1.cs 
     - Migration2.cs 

在我Up()方法,我得到這樣的文件,以便:

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. 
    } 
} 

這運行正常我的開發機器上,但是當我部署此與測試服務器八達通,我得到未發現異常

找不到路徑 的一部分的路徑「C:\八達通\應用程序\測試\解決方案\ 1.1 alpha21 \遷移\ CSVFolder」。

我檢查了'drop'文件夾,其中的輸出包括Migrations > CSVFolder

我試過幾種不同的方法來獲取文件夾的路徑,但他們在本地或在服務器上工作。獲得可在本地和服務器上工作的路徑的最佳方式是什麼?

回答

1

您必須正確設置路徑! 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. 

你已經注意到了,是不容易的你正在嘗試這樣做,你可以忘記這個apporach,這是招。最好的方法是將CVS文件附加到程序集資源中!和遷移過程中,你可以像下面這樣訪問他們:在截至

()

var file1 = Properties.Resources.File1; 

這種做法將保證SQL或CVS文件將始終連接/在運行時加載的程序集。

+0

「你必須檢查你有多少目錄,直到你到達所需的位置」 - 這正是問題陳述。 我並不是真的想將它們作爲資源嵌入到老實說中,但似乎這是我必須確保在兩種情況下都能正確使用的最佳方式。現在,我使用'Directory.GetDirectories(AppDomain.CurrentDomain.BaseDirectory,「CSVFolder」)[0]'解決了這個問題。這可以工作,但確實假設不會有多個名爲'CSVFolder'的目錄。 –

相關問題