2016-11-30 1 views
1

EF에서 몇 개의 테이블을 만들고 기본 키로 값을 몇 가지 시드 데이터로 입력했습니다. 응용 프로그램을 실행할 때 오류 메시지가 나타납니다..net 코어에서 identity-insert를 켜는 방법

IDENTITY_INSERT가 OFF로 설정된 경우 'Persons'테이블의 ID 열에 대해 명시 적 값을 삽입 할 수 없습니다.

어떻게 켜야합니까? 내가 사용하는 것이 여기에 읽기 :

[DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)] 기본 키는 해당 부동산 위의

. 불행히도 여전히 같은 오류 메시지가 나타납니다. 도와주세요.

업데이트 *

내가 추가

[DatabaseGenerated (DatabaseGeneratedOption.None)] 기본 키가 내 모든 속성. 마이그레이션을 실행하면 ID 열이 제거 된 것을 볼 수 있지만 여전히 동일한 오류 메시지가 표시됩니다.

SQL SEO에 들어갈 때 기본 키에서 ID 열을 계속 볼 수 있습니다. 데이터베이스 새로 고침을 시도했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내가 할 수있는 유일한 일은 속성에 들어가서 신원을 제거하는 것입니다.하지만 왜 내가 위에서 언급 한 방식대로 할 수 없습니까? 도와주세요.

+0

https://docs.microsoft.com/en-us/ef/core/index –

+0

기본 키 열을 절대 ID 열로 사용하지 않거나 일시적으로 ID를 해제하여 수동으로 몇 가지 레코드의 일부 키 값을 할당 할 수 있습니까? –

+0

IDENTITY_INSERT를 끄는 SQL 문은 테이블 이름이'mytable'이고 스키마가'dbo'라고 가정 할 때'SET IDENTITY_INSERT [dbo]. [mytable] OFF'입니다. IDENTITY_INSERT를 off로 설정하는 이유는 기본 키의 값을 수동으로 설정하지 못하게하기 위해서입니다. – kimbaudi

답변

4

EF Core 1.1.2에서는 트랜잭션과 함께 작동하도록했습니다. 시드 데이터를 테이블에 넣는 "데이터베이스 초기화 프로그램"에서. 나는 this EF6 answer에서 기술을 사용했다. 코드 예는 다음과 같습니다.

0

또 다른 방법은 명시 적으로 연결을 열고 SET IDENTITY_INSERT <table> ON입니다.

var conn = context.Database.GetDbConnection(); 
if (conn.State != ConnectionState.Open) 
    conn.Open(); 

context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Posts ON"); 

var post = new WeblogPost() 
{      
       Id= oldPost.Pk, // <!--- explicit value to Id field 
       Title = oldPost.Title, 
       ... 
}; 
context.Posts.Add(post);  
conn.Close(); 

명백하게 일단 연결이 명시 적으로 연결 EF 자동적으로 폐쇄되지 않는다는 EF 요청 이전에 개방되어 있으므로 설정은 동일한 접속 콘텍스트에 적용된다.

트랜잭션과 관련된 Steve의 응답이 트랜잭션이 연결을 유지하는 것과 같은 이유입니다.

참고 : 나중에 응용 프로그램/요청에서 다시 같은 컨텍스트를 사용할 계획 경우 using에 연결을 넣어 싶지 않아요. 연결이 존재해야하므로 연결 컨텍스트를 지우는 가장 좋은 방법은 .Close()입니다. 따라서 EF를 작업 당 연결 열기 및 닫기의 기본 동작으로 되돌립니다.

관련 문제