entity-framework - 마이그레이션 - 코드 퍼스트



보기에 매핑 된 객체의 원치 않는 마이그레이션 (1)

EF에서 마이그레이션을 생성하지 않도록 지시 할 수있는 방법을 찾지 못했지만이 방법이 도움이 될 수 있습니다.

  1. POCO를 만들 때 마이그레이션에서 CreateTable() 을 수행하지 마십시오. EF가 마이그레이션 파일을 만들고 싶다면 Sql(@"Create View ..."); 만 코드에 주석을 달 수 있습니다 Sql(@"Create View ..."); 실행됩니다.

  2. 그 다음에는 modelBuilder.Entity 항목이 아닌 뷰에 대한 DbSet 을 작성해야 DbSet .

  3. 변경이 필요한 경우 다른 테이블과 같은 방법으로 시작하십시오. POCO를 변경 한 다음 Add-Migration 을 실행하여 마이그레이션을 생성하십시오. 무엇을하고 싶은지 코멘트를 달고, Alter View 스크립트를 추가하십시오. 당신이 Down 에있는 것과 일치하는지 확인하십시오.

이렇게하면 변경 사항마다 단일 마이그레이션 파일 만 남게됩니다.

문제

우리는

public class Foo
{
    [Key, Column(Order = 0)]public virtual int A { get; set; }
    [Key, Column(Order = 1)]public virtual int B { get; set; }
}

SQL Server의 인덱싱 된 뷰에 매핑해야합니다. 접근 방식을 기반으로

EF 코드 우선 : Fluent API 및 https://stackoverflow.com/a/20887064/141172를 사용 하여 표식없는 객체 매핑

처음으로 마이그레이션을 만들었습니다.

public override void Up()
{
    CreateTable("dbo.Foos",
        c => new { A = c.Int(nullable:false), B = c.Int(nullable:false) })
        .PrimaryKey(t => new { t.A, t.B });
}

그런 다음 자동으로 생성 된 테이블을 삭제하기 위해 SQL을 추가 한 빈 마이그레이션을 수행 한 다음 인덱스를 추가합니다

public override void Up()
{
    Sql(@"DROP TABLE Foos");
    Sql(@"CREATE VIEW dbo.Foos As....");
}

마지막으로 DbContext에서 Foo는 뷰에 매핑됩니다.

modelBuilder.Entity<Foo>().ToTable("Foos");

우리가 Foo에 다른 속성을 추가 할 때까지 이것은 잘 동작했습니다.

[Key, Column(Order = 2)]public int C { get; set; }

새 마이그레이션을 추가하여보기를 재정의했습니다.

public override void Up()
{
    Sql(@"ALTER VIEW Foos ....");
}

변경보기 이주는 올바르게 적용되지만 EF는 새 특성을 고려하여 이주를 작성해야한다고 생각합니다.

보류중인 변경 사항이 있고 자동 이주가 사용 불가능하므로 현재 모델과 일치하도록 데이터베이스를 갱신 할 수 없습니다. 보류 모델 변경 사항을 코드 기반 마이그레이션에 기록하거나 자동 마이그레이션을 활성화하십시오.

내가 달릴 때.

Add-Migration WhatIsPending

EF 생성

public override void Up()
{
    DropPrimaryKey("dbo.Foos");
    AddColumn("dbo.Foos", "C", c => c.Int(nullable: false));
    AddPrimaryKey("dbo.Foos", new[] {"A", "B", "C" });
}

문제

개체를보기에 매핑하는 더 좋은 방법이 있습니까? 예를 들어 개체를 변경하면 어려움이 없습니까?

이것이 최선의 방법이라면 EF 마이그레이션에 마이그레이션을 생성 할 필요가 없다는 것을 어떻게 알릴 수 있습니까?





ef-migrations