6

EF6으로 업데이트했으며 재미 있지 않았습니다. 두 필드를 nullable로 변경하는 새로운 마이그레이션을 만들었습니다.EF 6.0 마이그레이션 : MigrationHistory의 ContextKey가 null입니다.

public partial class AllowNullableFieldsForImage : DbMigration 
{ 
    public override void Up() 
    { 
     AlterColumn("dbo.Scabs", "image_height", c => c.Int()); 
     AlterColumn("dbo.Scabs", "image_width", c => c.Int()); 
    } 

    public override void Down() 
    { 
     AlterColumn("dbo.Scabs", "image_width", c => c.Int(nullable: false)); 
     AlterColumn("dbo.Scabs", "image_height", c => c.Int(nullable: false)); 
    } 
} 

내가 update-database를 실행하면 나는 다음과 같은 오류 얻을 :이 왜 ... 내가 몇 MigrationHistory의 새로운 ContextKey 필드를 언급하는 기사하지만 내 질문에 대답 아무것도를 발견했습니다

Cannot insert the value NULL into column 'ContextKey', table 'ScabsContext.dbo.__MigrationHistory'; column does not allow nulls. INSERT fails. The statement has been terminated.

을 필드가 null입니까? 방법이 있습니까 (및해야합니까) ContextKey에 대한 값을 지정합니까? 나는 그것이 자동적으로하게되었다라고 생각했다?

답변

13

당신이 변경 작업을 수행 할 때 마이그레이션 테스트를 위해 데이터베이스를 사용하고있는 것처럼 보입니다. 내가 EF6에 EF5에서 프로젝트를 업그레이드 할 때

CREATE TABLE [dbo].[__MigrationHistory](
    [MigrationId] [nvarchar](255) NOT NULL, 
    [Model] [varbinary](max) NOT NULL, 
    [ProductVersion] [nvarchar](32) NOT NULL 
    CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY CLUSTERED 
    ([MigrationId] ASC) 
) 

, 나는이 목적을 위해 명시 적으로 마이그레이션을 추가 :는 EF5 마이그레이션 로그 테이블은 다음과 같은 구조를 가지고있다. 10 진수 필드를 사용하는 경우 어쨌든 명시적인 정밀도를 사용하여 다시 생성하므로 마이그레이션이 필요합니다. 당신이 EF6에서 첫 번째 마이그레이션을 실행하면

CREATE TABLE [dbo].[__MigrationHistory2] (
    [MigrationId] [nvarchar](150) NOT NULL, 
    [ContextKey] [nvarchar](300) NOT NULL, 
    [Model] [varbinary](max) NOT NULL, 
    [ProductVersion] [nvarchar](32) NOT NULL, 
    CONSTRAINT [PK_dbo.__MigrationHistory2] PRIMARY KEY ([MigrationId], [ContextKey]) 
) 

당신은이 표가 null이 아닌 ContextKey 필드를 포함하는 것을 알 수 있습니다 ...처럼 보이는 새로운 구조를 사용하여 마이그레이션 기록 테이블을 다시 만듭니다. 오류가 발생하기 때문에 EF6 형식 데이터베이스에서 EF5를 사용하여 마이그레이션을 실행하는 것이 좋습니다. 당신이 EF5에서 마이그레이션을 실행하기 위해 EF5 형식으로 데이터베이스를 되돌릴 단지 ContextKey 필드를 삭제하고 기본 키를 다시하려면

는 :

ALTER TABLE dbo.__MigrationHistory DROP CONSTRAINT [PK_dbo.__MigrationHistory2] 
ALTER TABLE dbo.__MigrationHistory DROP COLUMN ContextKey 
ALTER TABLE dbo.__MigrationHistory ADD CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY (MigrationId) 
+0

감사합니다. – tkt986

4

가 나는를 업데이트하려면 다음 스크립트를 생성 ef5 MigrationHistory를 ef6으로 변경하십시오. Migrations.Configuration을 네임 스페이스와 일치하도록 변경할 수 있습니다.

BEGIN TRANSACTION 

SELECT * 
INTO [tmp__MigrationHistory] 
FROM [__MigrationHistory] 

SELECT * 
FROM [tmp__MigrationHistory] 

DROP TABLE [__MigrationHistory] 

CREATE TABLE [dbo].[__MigrationHistory] (
    [MigrationId] [nvarchar](150) NOT NULL 
    ,[ContextKey] [nvarchar](300) NOT NULL 
    ,[Model] [varbinary](max) NOT NULL 
    ,[ProductVersion] [nvarchar](32) NOT NULL 
    ,CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY CLUSTERED (
     [MigrationId] ASC 
     ,[ContextKey] ASC 
     ) WITH (
     PAD_INDEX = OFF 
     ,STATISTICS_NORECOMPUTE = OFF 
     ,IGNORE_DUP_KEY = OFF 
     ,ALLOW_ROW_LOCKS = ON 
     ,ALLOW_PAGE_LOCKS = ON 
     ) 
    ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
GO 

INSERT INTO [__MigrationHistory] (
    [MigrationId] 
    ,[ContextKey] 
    ,[Model] 
    ,[ProductVersion] 
    ) 
SELECT [MigrationId] 
    ,'Migrations.Configuration' 
    ,[Model] 
    ,[ProductVersion] 
FROM [tmp__MigrationHistory] 

SELECT * 
FROM [__MigrationHistory] 

DROP TABLE [tmp__MigrationHistory] 

ROLLBACK TRANSACTION 
+0

'INSERT INTO' 문이 작동하기 위해서는 SQL Azure DB를 V12로 업그레이드해야했지만, 훌륭하게 작동했습니다. 감사합니다! –