2013-01-11 3 views
0

런타임시 엔터티 프레임 워크를 사용하여 데이터베이스를 마이그레이션하려고합니다.런타임 유형을 사용하는 제네릭 형식의 메서드

Database.SetInitializer<TContext>(new MigrateDatabaseToLatestVersion<TContext,TMigrationsConfiguration>); 
      } 

그러나 내가 런타임 때까지 TContext 또는 TMigrationsConfiguration를 모르는를 : 당신이 일반적으로 그렇게 얼마나
이입니다.

런타임 유형으로이 메소드를 어떻게 실행합니까?

foreach (IDatabaseInitializer<DbContext> initializer in moduleNeedingMigration.initializers) 
{ 
    System.Data.Entity.Database.SetInitializer(initializer); 
} 

그러나 나는이 작업을 수행 할 수 없습니다


업데이트 1 개

@Alexander Balte의 제안은

그래서이 오류없이 컴파일 IDatabaseInitializer 인터페이스를 사용하여에 저를 넣어 :

Module1Context이 DbContext


업데이트 2

을 상속 (210)

public IEnumerable<IDatabaseInitializer<DbContext>> initializers 
    { 
     get 
     { 
      List<IDatabaseInitializer<Module1Context>> list = new List<IDatabaseInitializer<Module1Context>>(); 
      MigrateDatabaseToLatestVersion<Module1Context, Configuration> init = new MigrateDatabaseToLatestVersion<Module1Context, Configuration>(); 
      list.Add(init); 
      return list;//Error cannot convert type List<IDatabaseInitializer<Module1Context>> to IEnumerable<IDatabaseInitializer<DbContext>> 
     } 
    } 

이 컴파일 :

return list.Cast<IDatabaseInitializer<UpfContext>>(); 

을 내가 응용 프로그램을 실행할 때 나는이 오류가 발생했습니다 :

System.Data.Entity.MigrateDatabaseToLatestVersion`2[Module1.Models.Module1Context,Module1.Migrations.Configuration]' to type 'System.Data.Entity.IDatabaseInitializer`1[System.Data.Entity.DbContext]'. 
+0

'유형 T'와 같은 변수가 있거나 일반 클래스'클래스 Blah '안에 있습니까? –

+0

런타임에 변수가 있습니다. – MrJD

+0

'IDatabaseInitializer '를'IDatabaseInitializer '에 캐스팅하는 것은 불가능합니다. 왜냐하면'IDatabaseInitializer'는 반공 변하기 때문입니다. –

답변

0

당신이 TContext 또는 TMigrationsConfiguration의 모든 가능한 세트를 알고 있다면 당신은 TContextTMigrationsConfiguration의 구체적인 종류에 의해 당신에게 MigrateDatabaseToLatestVersion를 반환합니다 somethig에 같은 공장 방법을 만들 수 있습니다. 같은

뭔가 :

private static Dictionary<Tuple<Type, Type>, Func<object>> _map = new Dictionary<Tuple<Type, Type>, Func<object>>(); 

    public static MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration> CreateMigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>(TContext type, TMigrationsConfiguration configuration) 
    { 
     Type contextType = typeof (TContext); 
     Type configurationType = typeof(TMigrationsConfiguration); 

     Func<object> builder; 
     if (!_map.TryGetValue(new Tuple<Type, Type>(contextType, configurationType), out builder)) 
      throw new KeyNotFoundException(); 

     return (MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>)builder(); 
    } 

사전 _map은 제네릭 인수 형식의 모든 가능한 세트로 초기화되어야한다. Like :

_map[new Tuple<Type, Type>(typeof(MyDbContext), typeof(MyDbMigrationsConfiguration)) =() => new MigrateDatabaseToLatestVersion<MyDbContext, MyDbMigrationsConfiguration>(); 
+0

IDatabaseInitializer 을 사용하려고 시도하고 – MrJD

+0

으로 돌아갑니다. 나는 가능한 모든 세트를 모른다는 것을 주목할 가치가 있습니다. Configurations (또는 IDatabaseInitializer s)를 사용하여 컨텍스트 배열을 전달합니다. - IDatabaseInitializer를 전달할 수 있는지 확인합니다. now – MrJD

+0

방금 ​​업데이트했습니다. – MrJD

관련 문제