2011-03-15 4 views
5

최신 EF 코드 First NuGet 패키지는 DontDropDbJustCreateTablesIfModelChanged이라는 사용자 지정 구현 IDatabaseInitializer과 함께 제공됩니다. 이름에서 알 수 있듯이 모델 변경이 감지되면 전체 데이터베이스를 삭제하고 다시 만들지 않고 테이블을 삭제하고 다시 만듭니다. EF 코드에 대한 사용자 정의 초기화 우선 열을 추가 할 테이블을 삭제하지 않습니다.

public class User 
{ 
    public string Username { get; set; } 

    // This property is new; the model has changed! 
    public string OpenID { get; set; } 
} 

어떻게 하나 어떤 테이블 중 하나을 떨어 뜨리지 않는 IDatabaseInitializer 것을 구현하는 방법에 대한 갈 것이라고 :

내가이 모델 클래스를 말한다. 이 경우 OpenID 열을 User 테이블에 추가하면됩니까?

답변

5

저는 이것이 SQL의 문제라고 생각합니다. 그래서 SQL Server에 대한 당신과 같이 쓸 수 있습니다 :

public class MyInitializer : IDatabaseInitializer<MyContext> 
{ 
    public void InitializeDatabase(MyContext context) 
    { 
     context.Database.SqlCommand(
      @" 
      IF NOT EXISTS (SELECT 1 FROM sys.columns AS col 
          INNER JOIN sys.tables AS tab ON tab.object_Id = col.object_Id 
          WHERE tab.Name = 'User' AND col.Name = 'OpenId') 
      BEGIN 
       ALTER TABLE dbo.User ADD OpenId INT; 
      END"); 
    } 
} 

을하지만 같은 방법으로 당신은 내가 더 나은 방법이라고 생각 응용 프로그램에 추가하지 않고 이러한 스크립트를 실행할 수 있습니다.

+0

예, 사용 가능한 모든 IDatabaseInitializer 구현이 "파괴적인"접근 방법을 선택하는 방법을 보았습니다. 감사합니다. –

+0

@Sergi Papaseit : 이것은 매우 흥미 롭습니다. 더 이상 가져 갔니? EF 4.1 코드로 구현 된 것 중 하나는 데이터베이스 마이그레이션입니다. 나는 위의 Ladislav가 제시 한 것이 실제로 정교하고 자동화 된 것이라면 실제로 일할 수 있다고 믿습니다. 그래서, 만약 당신이 이것에 더 깊이 들어갔다면, 우리와 함께 그것을 공유하십시오 :) – Kassem

+0

@ 카셈 - 저는 실제로 없습니다. 누군가는 SO에 대해 나에게 매우 좋은 지적을했습니다. 이것은 물론 개발 환경에서만 의미가 있다고 말했기 때문에 매번 DB를 삭제하지 않아도됩니다. ;) –

2

현재 코드 버전에서는 스키마를 수정하고 테이블에있을 수있는 모든 데이터를 보존 할 수 없습니다.

Database.SetInitializer<MyContext>(new MyDbInitializer()); 
: 같은 참조 데이터/조회 테이블과 같은 데이터를 유지하는가,이 릴리스에 중요하다면 당신은 당신의 테이블

public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     var countries = new List<Country> 
     { 
      new Country {Id=1, Name="United Kingdom"}, 
      new Country{Id=2, Name="Ireland"} 
     }; 

     countries.ForEach(c => context.Countries.Add(c)); 
    } 
} 

을 채우고 다음 위해 Application_Start에서 이것을 사용하는 종자 방법을 자신의 이니셜을 작성하고 대체 할 수 있습니다

나는 이것이 EF 팀에 의해 현재 다루어지고 있다고 생각하지만, 코드 첫머가 떨어지면 발표 할 준비가되지 않았다. 여기에서 미리보기를 볼 수 있습니다 : Code First Migrations

관련 문제