2016-11-20 2 views
4

저는 프로젝트에서 엔터티 프레임 워크 코드의 첫 번째 접근 방식을 따르고 있습니다. 몇 가지 문제가있었습니다. 항상 명령을 사용하여 db를 다시 생성해야합니다. 그러나, 지금 나는 그것을 안정되게 얻을 수 있었다. 시나리오가 있고 프레임 워크에서 마이그레이션 스크립트를 만드는 것이 논리적이 아니며 무언가를 놓치고 그 도움이 필요합니다Entity Framework - 코드 첫 번째 접근

시나리오는 다음과 같습니다. - 마이그레이션을 사용하도록 설정했으며 InitialCreate 모든 테이블 셋업이있는 클래스, 나는 그것에 꽤 감명을 받았다. 내가 엔티티에 변경을 때, 예를 들어, 내가 가진 거래 클래스

나는 LenderName, BorrowerName라는 새로운 속성을 추가하고, TEH 추가 이주 스크립트를 실행, 그것은 나를 위해 마이그레이션 스크립트를 생성

public partial class LenderBorrowerName : DbMigration 
    { 
     public override void Up() 
     { 
      DropColumn("dbo.Deals", "LenderName"); 
      DropColumn("dbo.Deals", "BorrowerName"); 
      DropColumn("dbo.Deals", "Discriminator"); 
     } 

     public override void Down() 
     { 
      AddColumn("dbo.Deals", "Discriminator", c => c.String(nullable: false, maxLength: 128)); 
      AddColumn("dbo.Deals", "BorrowerName", c => c.String()); 
      AddColumn("dbo.Deals", "LenderName", c => c.String()); 
     } 
    } 

문제는 원래 데이터베이스에이 필드가없고이 마이그레이션 스크립트를 통해 데이터베이스에 추가한다고 가정합니다. 이 필드를 업데이트하려면 update-migration -force를 실행하면 위의 up() 함수로 인해 테이블에서 열을 제거하려고 시도하기 때문에 실패합니다. Microsoft가 드롭 스크립트를 추가하는 이유는 개발자가 수동으로 제거해야한다는 것입니까? 도와주세요

답변

0

힌트는 여기 Discriminator입니다. EF는 상속을 구현하기위한 기본 전략 인 TPH, 테이블 당 계층 구조를 적용합니다. Discriminator 필드는 엔티티간에 상속이있을 때 EF에서 자동으로 생성됩니다.

두 엔티티를 기존 엔티티에 추가하는 것보다 모델에서 더 많은 변경을 한 것 같습니다. 파생 클래스에서 기본 클래스로 이동했거나 반대 방향으로 이동했을 것입니다. 또한 DbContext에는 기본 엔터티 또는 파생 된 엔터티에 대해서만 DbSet이 포함되어 있지만 둘 다 포함되지는 않습니다. 기본적으로 마이 그 레이션에는 DbContext에 포함 된 항목 만 DbSets으로 포함됩니다 (매핑에 명시 적으로 포함하거나 제외 할 수도 있음). 따라서 마이 그 레이션에서는 DbContext에있는 엔티티의 필드 만 생성하고 다른 엔티티에 대해서는 필드를 생성하지 않습니다. EF는 이러한 속성을 제거한 것으로 해석하므로 DropColumn 문장을 얻습니다.

여기 해결책은 누락 된 DbSetDbContext에 추가하고 마이그레이션을 다시 생성하는 것입니다.

Here TPH에 대한 자세한 정보가 있습니다.

다른 설명이 될 수있는 Update-DatabaseAdd-Migration 여러 번 실행하고 데이터베이스가 당신의 __MigrationHistory 테이블의 내용과 일치 인 상태로 남아되었습니다 -force 매개 변수를 사용 후. 가능한 한 데이터베이스를 수동으로 삭제하고 깨끗한 Initial 마이그레이션을 생성하고 실행하는 것이 좋습니다.

관련 문제