문제

내 EF 마이그레이션 중 하나는 테이블을 만들고이 테이블을 초기 데이터로 채우려는 마이그레이션 Up 메서드의 일부로 작성합니다.

여기 내 이주 클래스가 있습니다 :

public partial class Objects : DbMigration
{
    void Fill(string table, string path, string fieldTerminator = ",", string rowTerminator = @"\n")
    {
        Sql(string.Format("BULK INSERT {0} FROM '{1}' WITH (FIELDTERMINATOR = '{2}', ROWTERMINATOR = '{3}')", table, path, fieldTerminator, rowTerminator));
    }

    public override void Up()
    {
        CreateTable(
            "dbo.Objects",
            c => new
                {
                    ObjectId = c.Int(nullable: false),
                    Name = c.String(),
                    Location_X = c.Double(nullable: false),
                    Location_Y = c.Double(nullable: false),
                    Location_Z = c.Double(nullable: false),
                })
            .PrimaryKey(t => t.ObjectId);

        Fill("dbo.Objects", @"C:\temp\Scratch\Junk\ConsoleApplication3\data\objects.csv");
    }

    public override void Down()
    {
        DropTable("dbo.Objects");
    }
}
.

패키지 관리자 콘솔에서 내 시스템에서 올바르게 작동합니다.그러나 전체 개발 팀이 쉽게 사용할 수 있도록 파일의 상대 경로를 사용하고 싶습니다.

파일 이름을 단순히 썼을 때 업데이트가 실패했습니다.현재 디렉토리를 파일 이름으로 연결하여 현재 디렉토리가 C : \ Windows \ System32를 보았습니다.

프로젝트 또는 솔루션 디렉토리에서 업데이트를 실행하려면 어떻게합니까?

또는 업데이트 중에 테이블을 채우는 더 좋은 방법이 있습니까?Seed 메서드를 사용하고 싶지 않아 내가 원하는 것을 정확하게하지 않습니다.예를 들어, 다른 마이그레이션에 대해 다른 코드를 작성하려는 경우 단일 Seed 메소드 만 있습니다.

도움이 되었습니까?

해결책

해결 방법 현재 소스 파일의 경로를 가져온 다음 데이터가있는 CSV 파일의 상대 경로를 입력 할 수 있습니다.

의미 대신 :

dataFile = @"C:\temp\Scratch\Junk\ConsoleApplication3\data\objects.csv";
.

는 다음과 같습니다 :

currentFile = GetSourceFilePath(); // See below hints for implementation
dataFile = Path.Combine(
    Path.GetDirectoryName(currentFile),
    @"..\data\objects.csv"
);
.

소스 파일 경로에 액세스하는 방법의 몇 가지 예가 있습니다 - C # / p>에서 소스 파일 이름과 LineNumber를 인쇄하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top