2012-12-07 2 views
1

Migrations 클래스의 이름이 문자열 인 경우 Orchard_Framework_DataMigrationRecord에 저장된 현재 버전 번호를 얻으려면 어떻게해야합니까?Orchard CMS- 현재 Data Migration Record 버전 번호 받기

IExtensionManager에서 버전을 볼 수 있지만 module.txt에 정의 된대로 모듈 버전 인 것처럼 보입니다.

+1

무엇이 필요합니까? –

+0

좋은 질문 - 몇 가지 도우미로 명령 행 도구를 확장하려고합니다. 그 중 하나는 codegen 모듈과 비슷한 새로운 위젯을 만들기 위해 클래스, 메소드 및 파일을 스텁 (stub)하는 명령입니다. UpdateFromX() 메서드 (X는 현재 버전 +1)를 만들 수 있도록 모듈이있는 마이그레이션 버전을 알아야합니다. –

답변

0

OK, 그래서 나는이 myself- 나는 오차드 이미 나는 그것이 마이그레이션 방법을 발사 할 때 요구하는 것과 유사한 코드를 실행해야 함을 알고

를 해결했습니다, 그래서 나는 새로운 마이그레이션 파일을 생성하고, 넣어 Create() 메서드의 중단 점. 중단 점이 발생하면 Orchard.Data.Migration에서 DataMigrationManager를 찾기 위해 호출 스택을 조사했습니다. 내가 필요한 모든 것이 거기에 있었고, 다른 누군가가 비슷한 요구 사항을 가지고 있다면, 그 클래스를 출발점으로 생각해 보길 권한다.

거의 바로 그 클래스에서 해제된다 방법

 string moduleName="Your.Module.Name"; 
     var migrations = GetDataMigrations(moduleName); 

     // apply update methods to each migration class for the module 
     var current = 0; 
     foreach (var migration in migrations) 
     { 
      // copy the objet for the Linq query 
      var tempMigration = migration; 

      // get current version for this migration 
      var dataMigrationRecord = GetDataMigrationRecord(tempMigration); 

      if (dataMigrationRecord != null) 
      { 
       current = dataMigrationRecord.Version.Value; 
      } 

      // do we need to call Create() ? 
      if (current == 0) 
      { 
       // try to resolve a Create method 

       var createMethod = GetCreateMethod(migration); 
       if (createMethod != null) 
       { 
        //create method has been written, but not executed! 
        current = (int)createMethod.Invoke(migration, new object[0]); 
       } 
      } 
     } 
     Context.Output.WriteLine("Version: {0}", current); 

몇 당신이 필요로 할 수 있습니다

private DataMigrationRecord GetDataMigrationRecord(IDataMigration tempMigration) 
    { 
     return _dataMigrationRepository.Table 
      .Where(dm => dm.DataMigrationClass == tempMigration.GetType().FullName) 
      .FirstOrDefault(); 
    } 

    private static MethodInfo GetCreateMethod(IDataMigration dataMigration) 
    { 
     var methodInfo = dataMigration.GetType().GetMethod("Create", BindingFlags.Public | BindingFlags.Instance); 
     if (methodInfo != null && methodInfo.ReturnType == typeof(int)) 
     { 
      return methodInfo; 
     } 

     return null; 
    } 

당신이해야 할 수도 있습니다 종속성을 주입하는 것을 잊지 마십시오.

+0

오, 뭔가 다른 점 - 각 모듈에 하나의 마이그레이션 번호가 있다는 인상하에있었습니다. . 이제는 모듈이 여러 개의 마이그레이션 클래스를 가질 수 있으며 버전 번호는 각 클래스를 참조해야한다고 잘못 생각합니다. –

+0

아니요, 기능마다 있습니다. –

관련 문제