2016-08-11 1 views
2

저는 프로젝트에서 Entity Framework 코드를 처음으로 사용하고 있습니다. 이러한 마이그레이션 중 하나는 프로젝트의 디렉토리에있는 csv 파일의 데이터를 읽음으로써 데이터베이스 테이블을 채 웁니다. 이 프로젝트 구조는 다음과 같습니다EF 마이그레이션 스크립트에서 디렉토리 경로를 찾는 가장 좋은 방법은 무엇입니까?

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

이 내 dev에 컴퓨터에서 잘 실행하지만 때 내가 테스트 서버에이를 배포 :

Up() 방법에서
- Soulution 
    - Project 
     - Migrations 
     - CSVFolder 
      - file1.csv 
      - file2.csv 
     - Migration1.cs 
     - Migration2.cs 

, 나는 이러한 파일과 같이 얻을 ': \ 문어 \ 응용 프로그램 \ 1.1 alpha21 \ 마이그레이션 \ CSVFolder \ 테스트 \ 솔루션 C'문어, 나는 경로 의 일부를 찾을 수 없습니다

예외

찾을 수없는 경로를 얻을.

'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'라는 이름의 디렉토리가 여러 개 없을 것이라고 가정합니다. –