Entity Framework는 두 수준의 관계로 새 엔터티에 대한 변경 내용을 저장하지 않습니다.

entity-framework savechanges

문제

ADO.NET Entity Framework를 사용하여 ASP.NET MVC 사이트를 구축하고 있습니다. 외래 키와 연관된 이러한 엔티티를 포함하는 엔티티 모델이 있습니다.

보고서 (ID, 날짜, 제목, 보고서 _ 유형 _ID 등)

  • SubReport (ID, ReportText 등) - 보고서와 일대일 관계.
    • ReportSource (ID, Name, Description) - Sub_Report와 일대 다 관계입니다.
      • ReportSourceType (ID, Name, Description) - ReportSource와 일대 다 관계입니다.
      • 연락처 (ID, 이름, 주소 등) - Report_Source와 일대일 관계.

SubReport의 각 유형에 대한 Create.aspx 페이지가 있습니다. 이벤트 후 메서드는 새 Sub_Report 엔터티를 반환합니다.

이전의 게시 방법에서는이 프로세스를 따랐습니다.

  1. 페이지 필드에서 새 Report 엔티티의 속성을 설정합니다.
  2. 페이지 필드에서 SubReport 엔티티의 특정 등록 정보를 설정하십시오.
  3. SubReport 엔터티의 보고서를 1로 만든 새 보고서 엔터티로 설정합니다.
  4. 페이지에서 제공 한 ID를 사용하여 ReportSource를 찾아 Sub_Report 엔터티의 ReportSource를 찾은 엔터티로 설정합니다.
  5. 변경 사항을 저장하다.

이 워크 플로우는 2 주 동안 정상적으로 성공했습니다. 그런데 지난 주에 뭔가 바뀌었고 더 이상 작동하지 않습니다. 이제 저장 작업 대신이 예외가 발생합니다.

UpdateException: "Entities in 'DIR2_5Entities.ReportSourceSet' 
participate in the 'FK_ReportSources_ReportSourceTypes' relationship. 
0 related 'ReportSourceTypes' were found. 1 'Report_Source_Types' is expected."

디버그 시각화 프로그램은 다음을 보여줍니다 :

  • SubReport의 ReportSource가 설정되고로드되고 모든 속성이 정확합니다.
  • Report_Source에 유효한 ReportSourceType 엔티티가 첨부되어 있습니다.

SQL 프로파일 러에서 준비된 SQL 문은 정상적으로 보입니다. 아무도 내가 뭘 놓치고있는 분명한 사실을 지적 해 줄 수 있습니까?

티아

참고 :이 경우 Report 및 SubReport는 항상 새로운 엔터티입니다. Report 엔티티는 여러 유형의 보고서에 공통된 등록 정보를 포함하며 일반 쿼리에 사용됩니다. 하위 보고서는 유형별로 다른 매개 변수가있는 특정 보고서입니다. 실제로 SubReport의 각 유형에 대해 다른 엔티티 집합이 있지만이 질문은 모두에 적용되므로 SubReport를 단순화 된 예제로 사용합니다.

수락 된 답변

이것은 데이터베이스 테이블이 서로 1 - 1 관계를 갖는 경우에 발생합니다. 귀하의 예제에서 reportsourceset은 그것이 참조하는 ID와 함께 reportsorttype을 기대합니다. 내 관계가 반대 테이블의 두 기본 키를 함께 연결하는 경우이 문제가 발생했습니다.


인기 답변

나는 이것에 늦었다는 것을 깨닫는다. 그러나 나는 비슷한 문제를 겪었다. 그리고 나는 해결책을 생각해 내기 전에 약 3 시간 동안 그것을 해킹했다. 나는 코드를 게시 하겠지만, 집에있다. 누군가가 필요하다면 나중에 할 수있다.

확인할 사항은 다음과 같습니다.

  • SaveChanges () 호출에 중단 점을 설정하고 깊이있는 개체 컨텍스트를 검사하십시오. 컨텍스트 추가 및 변경 목록이 표시되어야합니다. 내가 처음 보았을 때, 나는 그것들을 가리 키지 않고 관련된 모든 객체를 추가 하려고 시도한다는 것을 알았습니다. 귀하의 경우, 컨텍스트가 새 Report_Source_Type을 추가하려고 할 수 있습니다.
  • 이전과 관련이 있지만 보고서 원본을 가져 오는 경우 해당 원본이 해당 엔터티 키를 통해 데이터베이스에서 검색되고 컨텍스트에 제대로 첨부되어 있는지 확인하십시오. 그렇지 않다면 컨텍스트가 새 항목이라고 생각할 수 있으므로 필요한 관계가 설정되지 않습니다.

메모리에서 context.GetObjectByKey 메서드를 사용하여 참조를 검색 한 다음 원래 개체의 속성에 context.Attach 메서드를 할당하기 전에 context.Attach 메서드를 사용하여 해당 개체를 컨텍스트에 명시 적으로 첨부했습니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow