이미 마이 그 레이션이 적용된 데이터베이스에서 마이 그 레이션을 롤백하려고하는 문제가 있습니다.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를 키로 사용합니다).
당신이 nullable이 아닌 PK에 대한 기본 값을 가질 수 있습니다
어쨌든,이 솔루션은 명시 적으로
AddColumn
전화에maxLength
매개 변수를 추가하는 것입니다? 테이블에 데이터가 있습니까? 테이블이 비어 있지 않으면 같은 기본값을 가진 컬럼에 PK를 생성 할 수 없습니다 ... – oerkelens대부분 AddChild (...)에'maxLength : some_value'를 추가해야합니다 (길이 제한이없는 문자열은 사용할 수 없습니다). PK로 사용됨). 그러나 고유 한 데이터로 열을 채워야 할 필요가 있습니다. 그렇지 않으면'AddPrimaryKey'가 실패합니다. 일반적으로 데이터 손실로 이어지는 이러한 마이그레이션 (열 제거)은 되돌릴 수 없습니다. –
@oerlekens EventStaffRequest 테이블이 비어 있으므로 마이그레이션을 롤백하기 전에 모든 레코드를 제거했습니다. 마이그레이션 할 때'defaultvalue = Guid.NewGuid(). ToString()'을 설정하려했지만 슬프게도 아무 것도 바뀌지 않습니다. – nbokmans