UFO ET IT

프로덕션에서 Entity Framework (코드 우선) 마이그레이션 사용

ufoet 2020. 11. 23. 20:39
반응형

프로덕션에서 Entity Framework (코드 우선) 마이그레이션 사용


저는 프로젝트에 EF 마이그레이션을 사용하고 특히 릴리스 간의 프로덕션에서 스키마 변경을 수행하는 방법을 찾고 있습니다.

DbMigration클래스를 사용하여 런타임에 이러한 마이그레이션을 수행하는 API가 있다고 언급 했지만 특정 예제를 찾을 수 없습니다.

이상적으로 DbMigration는 모든 데이터베이스 변경에 대해 하나의 파일을 원하고 이러한 변경 사항은 현재 버전에서 최신 버전까지 응용 프로그램을 시작할 때 자동으로 적용됩니다.


시작할 때 최신 버전으로 마이그레이션하는 데 사용할 수있는 Database Initializer가 있습니다 (또는 더 좋은 방법은 dbinitializer가 첫 번째 db 액세스에서 시작됨). 다음 MigrateDatabaseToLatestVersion과 같이 사용합니다.

Database.SetInitializer<ObjectContext>(
    new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());

마이그레이션 당 하나의 파일을 갖는 것과 관련하여 자동 마이그레이션을 활성화하면 Migrations프로젝트 루트의 폴더 (기본적으로)에서 찾을 수 있습니다 .

관련 정보 (예제 포함) : http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx


이것도 작동합니다.

var configuration = new MyDbContextConfiguration();
configuration.TargetDatabase = new DbConnectionInfo(
    database.ConnectionString, database.ProviderName);

var migrator = new DbMigrator(configuration);
migrator.Update();

다음으로 전화 할 수도 있습니다.

migrator.GetPendingMigrations();

적용해야하는 마이그레이션 목록을 얻으려면


사용중인 Visual Studio 버전 또는 데이터베이스를 지정하지 않았으므로 여기에 대답을 추가하여 Microsoft의 SQL Server를 사용하는 VS2015에서 "게시"도구를 사용하면 매우 쉽습니다.

당신이 말하는 API에 신경 쓸 필요가 없습니다. 로컬에서 작업을 수행하고 모델을 변경하고 마이그레이션을 적용한 다음 릴리스 / 테스트 서버로 푸시하려면 게시 도구를 사용하십시오.

응용 프로그램이 처음 시작될 때 로컬에서 수행 한 마이그레이션을 원격 서버에 적용하도록 선택할 수 있습니다.

모든 마이그레이션과 모든 작업이 로컬에서 수행되면 (개발 환경에서 추정 가능) 게시 (프로젝트를 마우스 오른쪽 단추로 클릭하고 "게시 ..."를 클릭합니다. 아래의 "코드 우선 마이그레이션 실행 (애플리케이션 시작시 실행)"확인란을 선택합니다.) "설정"탭을 클릭 한 다음 앱에 처음 액세스 할 때 마이그레이션을 적용합니다 (처음에는 약간의 지연이 있음).

웹 배포를 사용하여 웹 게시

가이드 : https://msdn.microsoft.com/en-us/library/dd465337(v=vs.110).aspx

Windows 2012 서버에이 작업을 수행해야했기 때문에이 모든 것을 배웠습니다. http://www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/

행운을 빕니다!


코드에서 명시 적으로 실행되는 마이그레이션을 제어하고 싶었고 많은 검색 후에 DbConfiguration 클래스 또는 자동 마이그레이션을 활성화하지 않고도 다음 기술을 개발할 수있었습니다.

public static void RunMigration(this DbContext context, DbMigration migration)
{            
    var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance);
    if (prop != null)
    {
        IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>;
        var generator = new SqlServerMigrationSqlGenerator();
        var statements = generator.Generate(operations, "2008");
        foreach (MigrationStatement item in statements)
            context.Database.ExecuteSqlCommand(item.Sql);
    }
}

다음과 같은 마이그레이션이있는 경우 :

public class CreateIndexOnContactCodeMigration : DbMigration
{
    public override void Up()
    {
        this.CreateIndex("Contacts", "Code");
    }

    public override void Down()
    {
        base.Down();
        this.DropIndex("Contacts", "Code");
    }
}

다음과 같이 사용합니다.

using (var dbCrm = new CrmDbContext(connectionString))
{
    var migration = new CreateIndexOnContactCodeMigration();
    migration.Up();                
    dbCrm.RunMigration(migration);
}

문안 인사.


이미 게시 된 모든 답변에 추가합니다. Entity Framework는 테이블 dbo .__ MigrationHistory를 사용하여 데이터 삽입 또는 데이터베이스 스키마 변경과 같은 마이그레이션 실행을 방지하기 위해 데이터베이스에 이미 적용된 모든 마이그레이션을 추적합니다.

데이터 추가 실행 또는 데이터베이스 스키마 변경과 같은 스크립트를 실행하려면 패키지 관리자 콘솔을 사용하여 빈 마이그레이션을 생성하고 새로 추가 된 마이그레이션을 통해 스크립트를 실행할 수 있습니다. 이니셜 라이저를 사용하여 EF가 실행할 때마다 데이터베이스를 삭제하고 다시 만드는 것을 방지해야합니다.

     public override void Up()
    {
        string directoryToSearchScripts = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..\\..\\"));

        string scriptFilePath = Directory.GetFiles(directoryToSearchScripts, "dummy-script.sql", SearchOption.AllDirectories).FirstOrDefault();
        if (!string.IsNullOrEmpty(scriptFilePath))
        {
            string fundsSqlScript = File.ReadAllText(scriptFilePath);
            Sql(fundsSqlScript);
        }
    }

    public override void Down()
    {
    }

응용 프로그램을 게시하고 "코드 우선 마이그레이션 실행"옵션을 선택하면 EF는 아직 데이터베이스에 적용되지 않은 마이그레이션을 실행합니다.

참고 URL : https://stackoverflow.com/questions/10848746/using-entity-framework-code-first-migrations-in-production

반응형