2016-08-03 7 views
0

매우 오랫동안 문제가 있습니다. 이 예를 상상할 수 있습니다 : 나는 두 가지 모델을 만들었습니다Microsoft.EntityFrameworkCore.dll에서 'Microsoft.EntityFrameworkCore.DbUpdateException'유형의 예외가 발생했습니다.

public class Coordinate { 

    public int id {get;set;} 
    public int x {get;set;} 
    public int y {get;set;} 
} 
public class Planet { 

    public int id {get;set;} 
    public string name {get;set;} 
    public Coordinate coordinate {get;set;} 
} 

, 그리고 모델 행성이 모델은 속성으로 좌표했다. 이제 코드 어딘가에 하나의 좌표를 만들고 데이터베이스에 저장한다고 상상해보십시오. 이것이 상상 좌표 :

Coordinate c = new Coordinate(); 
c.x = 1; 
c.y = 2; 

가 그럼 난 내 데이터베이스에 추가하고이 저장됩니다.

하지만 행성을 만들고 내가 수행 할 때

An exception of type 'Microsoft.EntityFrameworkCore.DbUpdateException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code

Additional information: An error occurred while updating the entries. See the inner exception for details.

내가 속성을 변경할 수 있습니다 알고

planet.coordinate = c; 

그리고 나는 데이터베이스에 추가하려고 나는 다음과 같은 오류가 public Coordinate coordinate ~ public int coordinate_id이지만 대신 좌표 모델을 사용하여이 작업을 수행하고 싶습니다.

나는 당신에게 무슨 일이 잘못에 대한 상세한 설명을 줄 것이다 내부 예외를 살펴 갖는 ASP NET CORE 1.0

Cumps

+0

(예를 들어, 단지 추가로하지만, 지구를 추가 관계 픽스 동일한 결과로 연결되어야 좌표) "세부 사항에 대한 내부 예외 참조." 그래서 그것은 무엇을 말하는가? – DavidG

답변

1

귀하의 문제는이 시점에서 c가 이미 Id를 가지고 있다는 것입니다.

planet.Add를 사용하면 행성 및 이에 연결된 모든 좌표가 DbSet에 추가로 설정되고 SaveChanges를 호출하면 삽입 문이 만들어집니다. SaveChanges를가 완료되면 지구가 데이터베이스에 있는지

은 EF가 표시됩니다 (여기서 나는 당신의 열 및 Id 속성 상에 자동 증가를 가정)하지만, 단지 좌표 추가의 이드 (가 DBMS에 의해 변경되었다 다르다 그래서 좌표는 두 개의 서로 다른 ID가있는 데이터베이스에서 두 번이므로) 뭔가 잘못되어이 예외가 발생할 것으로 예상됩니다. 중복 항목이 문제가 발생하지 않는 경우

이 두 가지 솔루션이있다, 그렇지 않으면 0을 널 (null)하거나 이드의 설정 :

- 설정에만 FK 속성이 아닌 탐색 속성이

또는

울어 SaveChanges를 한번만

+0

방금 ​​깨달은 것 : c의 EntityState를 EntityState.Modified로 설정하여 세 번째 해결 방법이 있습니다. – DevilSuichiro

+0

나는 세 번째 해결책을 좋아한다. 그래서 행성을 추가 할 때 나는 "context.Entry (planet.coordinate) .State = EntityState.Modified? –

+0

네. 그러나 이제는 이것에 대해서 생각해 보자. 이것은 DbUpdateConcurrencyException과 중복 된 항목을 피할 뿐이다. .DbUpdateException을 던져 코드에 다른 오류가 있다고 생각합니까? InnerException을 봐야합니다. – DevilSuichiro

0

을 사용하고 있습니다.

이렇게하려면 디버그 모드에서 예외가 표시됩니다. 자세히보기를 클릭하고 내부 예외를 찾을 때까지 트리를 따르십시오.

중복 행, 기본 키 문제 또는 구조 문제가있을 수 있습니다.

+0

이 질문에 대답하지 않습니다, 그것은 디버깅 조언을 제공합니다. – DavidG

+0

나는 데이비드를 이해하지만, 대리인이 적다. 나는 말할 수 없다. .. 그래서 나는 어떻게해야만 하는가. – mt025

+0

[Go 50 points earn] (http://stackoverflow.com/help/whats-reputation) 오랜 시간이 걸리지 않습니다.질문에 대한 수정을 제안하면 형식 지정에 도움이 필요한 항목이 많습니다. – DavidG

관련 문제