2017-11-24 1 views
1

이미 마이 그 레이션이 적용된 데이터베이스에서 마이 그 레이션을 롤백하려고하는 문제가 있습니다.EFCore 롤백 마이그레이션 오류 : 키 열로 사용할 잘못된 유형의 열

Failed executing DbCommand (8ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] 
ALTER TABLE [EventStaffRequest] ADD CONSTRAINT [PK_EventStaffRequest] PRIMARY KEY ([Id]); 
System.Data.SqlClient.SqlException (0x80131904): Column 'Id' in table 'EventStaffRequest' is of a type that is invalid for use as a key column in an index. 
Could not create constraint or index. See previous errors. 

ClientConnectionId:29574816-2b1a-4490-a216-a54cd7a2d33b 
Error Number:1919,State:1,Class:16 
Column 'Id' in table 'EventStaffRequest' is of a type that is invalid for use as a key column in an index. 
Could not create constraint or index. See previous errors. 

이 내가 롤백하기 위해 노력하고있어 마이그레이션입니다 :

은 내가 오류입니다

:

public partial class AddedCompositeKeyToEventStaffRequest : Migration 
{ 
    protected override void Up(MigrationBuilder migrationBuilder) 
    { 
     migrationBuilder.DropPrimaryKey(
      name: "PK_EventStaffRequest", 
      table: "EventStaffRequest"); 

     migrationBuilder.DropIndex(
      name: "IX_EventStaffRequest_EventId", 
      table: "EventStaffRequest"); 

     migrationBuilder.DropColumn(
      name: "Id", 
      table: "EventStaffRequest"); 

     migrationBuilder.AddPrimaryKey(
      name: "PK_EventStaffRequest", 
      table: "EventStaffRequest", 
      columns: new[] { "EventId", "QualityTypeId" }); 
    } 

    protected override void Down(MigrationBuilder migrationBuilder) 
    { 
     migrationBuilder.DropPrimaryKey(
      name: "PK_EventStaffRequest", 
      table: "EventStaffRequest"); 

     migrationBuilder.AddColumn<string>(
      name: "Id", 
      table: "EventStaffRequest", 
      nullable: false, 
      defaultValue: ""); 

     migrationBuilder.AddPrimaryKey(
      name: "PK_EventStaffRequest", 
      table: "EventStaffRequest", 
      column: "Id"); 

     migrationBuilder.CreateIndex(
      name: "IX_EventStaffRequest_EventId", 
      table: "EventStaffRequest", 
      column: "EventId"); 
    } 
} 

를가 관련이있는 경우는,이 ​​내 모델 코드

public class EventStaffRequest 
{ 
    [Required] 
    public string EventId { get; set; } 
    public virtual Event Event { get; set; } 

    [Required] 
    public string QualityTypeId { get; set; } 
    public virtual QualityType QualityType { get; set; } 

    [Required] 
    public int AmountRequired { get; set; } 

    [Required] 
    public int MinimumRating { get; set; } 
} 

기본 키를 복합 키로 변경해야하기 때문에이 마이그레이션이 생성되었습니다. 그래서 내 DbContext에서 (이것은 당신이 무엇을보고있는 마이그레이션의 Up() 같아요)과 같은 복합 기본 키를 적용한 : 왜 내 롤백이 성공되지

builder.Entity<EventStaffRequest>() 
    .HasKey(esr => new { esr.EventId, esr.QualityTypeId }); 

? string이 키 인덱스에 적절한 유형이 아닌 이유를 이해할 수 없습니다 (GUID를 키로 사용합니다).

+0

당신이 nullable이 아닌 PK에 대한 기본 값을 가질 수 있습니다

어쨌든,이 솔루션은 명시 적으로 AddColumn 전화에 maxLength 매개 변수를 추가하는 것입니다? 테이블에 데이터가 있습니까? 테이블이 비어 있지 않으면 같은 기본값을 가진 컬럼에 PK를 생성 할 수 없습니다 ... – oerkelens

+0

대부분 AddChild (...)에'maxLength : some_value'를 추가해야합니다 (길이 제한이없는 문자열은 사용할 수 없습니다). PK로 사용됨). 그러나 고유 한 데이터로 열을 채워야 할 필요가 있습니다. 그렇지 않으면'AddPrimaryKey'가 실패합니다. 일반적으로 데이터 손실로 이어지는 이러한 마이그레이션 (열 제거)은 되돌릴 수 없습니다. –

+0

@oerlekens EventStaffRequest 테이블이 비어 있으므로 마이그레이션을 롤백하기 전에 모든 레코드를 제거했습니다. 마이그레이션 할 때'defaultvalue = Guid.NewGuid(). ToString()'을 설정하려했지만 슬프게도 아무 것도 바뀌지 않습니다. – nbokmans

답변

2

마이그레이션 시스템에 문제가있는 것 같습니다. 문제는 string이 아니며 (물론 PK에 사용할 수 있음), maxLength입니다. 기본적으로 string 열은 길이에 제한이 없지만 PK는 일부 제한을 적용해야합니다. 당신이 maxLength를 지정하지 않은 경우에도

는 일반적으로 당신이 PK로 string 열을 사용하는 경우, EF는 자동으로 (나는 적어도 SQLSERVER 것이 450입니다 무엇을보고에서) 몇 가지 제한을 적용합니다. 흥미롭게도 역순으로 수행 한 작업을 수행하면 UpDown 내용이 서로 바뀌면서 유사한 마이그레이션이 발생하고 AddColumn과 동일한 코드가 작동합니다. 하지만 Down 메쏘드에서 실행될 때가 아니라, 그 경로에 차이 (따라서 문제)가 있어야합니다. EF 핵심 이슈 트래커에 게시하여 (그리고 결국 해결할 수 있도록) 고려해보십시오.

migrationBuilder.AddColumn<string>(
    name: "Id", 
    table: "EventStaffRequest", 
    maxLength: 450, 
    nullable: false, 
    defaultValue: ""); 
관련 문제