source

엔티티 프레임워크가 복합 키(Oracle)를 사용하여 테이블의 데이터를 업데이트할 수 없음

manysource 2023. 9. 27. 18:00

엔티티 프레임워크가 복합 키(Oracle)를 사용하여 테이블의 데이터를 업데이트할 수 없음

3열로 구성된 복합 키를 가진 Oracle 테이블이 있습니다.이러한 열은 엔티티 프레임워크 데이터 모델을 통해 C# 개체로 올바르게 매핑됩니다.데이터베이스에서 레코드를 쿼리한 다음 키가 아닌 열을 업데이트하면 항상 기본 키를 업데이트하려고 한다는 오류가 발생합니다(테스트 제외).

var connection = new DbContextProvider(() => new DatabaseConnection()); 
var repo = new Repository(connection); 
var deltas = repo.Queryable<Deltas>().Where(d =>d.Volume.SubmissionId == 88921).ToList();
var deltaToUpdate = deltas.First(); 
deltaToUpdate.RecordedVolume = 0;
repo.Flush();  -- Does a context.SaveChanges() in background

우리는 항상 다음을 받습니다.

System.잘못된 작동예외 : 'COPY_' 속성ID'는 개체의 키 정보의 일부이므로 수정할 수 없습니다.

COPY_ID는 키의 일부이지만 StoreGeneratedPettern= identity이며 트랜잭션에서 변경되지 않습니다.

어떤 도움이든 감사히 받겠습니다.

전체 스택은 다음과 같습니다.

System.잘못된 작동예외 : 'COPY_' 속성ID'는 개체의 키 정보의 일부이므로 수정할 수 없습니다.데이터에서.물건들.엔터티 엔트리.엔티티 값 편집 가능 여부 확인(상태 관리자)Metadata typeMetadata, Int32 순서형, String memberName)을 입력합니다.

시스템에서.데이터.객체.엔터티 엔트리.GetAndValidateChangeMemberInfo(StringentityMemberName, Object complexObject, String complexObjectMemberName, refStateManager)Metadata typeMetadata, ref String changingMemberName, ref Object changingObject)를 입력합니다.

시스템에서.데이터.객체.엔터티 엔트리.EntityMemberChanging(String entityMemberName, Object complexObject, String complexObjectMemberName)

시스템에서.데이터.객체.엔터티 엔트리.엔티티 멤버 변경(String 엔티티MemberName)

시스템에서.데이터.객체.개체 상태 항목입니다.시스템.데이터.객체.데이터 클래스.I 엔티티 변경 추적기.엔티티 멤버 변경(String 엔티티MemberName)

시스템에서.데이터.객체.내부의.스냅샷 변경 추적 전략.현재 값 설정(Entity)항목 항목, StateManagerMemberMetadata멤버, Int32 순서, Object target, Object value)

시스템에서.데이터.객체.내부의.엔티티 래퍼'1.현재 값 설정(Entity)항목 항목, StateManagerMemberMetadata멤버, Int32 순서, Object target, Object value)

시스템에서.데이터.객체.엔터티 엔트리.현재 엔터티 값 설정(State Manager)메타데이터 메타데이터, Int32 순서형, Object userObject, Object newValue를 입력합니다.

시스템에서.데이터.객체.ObjectStateEntryDbUpdateableDataRecord입니다.RecordValue 설정(Int32 서수, Object value

시스템에서.데이터.객체.DbUpdateable Data Record.SetValue(Int32 서수, Object value)

시스템에서.데이터. 매핑.갱신하다.내부의.번역기 업데이트.ServerGenValue 설정(PropagatorResult 컨텍스트, Object value)

시스템에서.데이터. 매핑.갱신하다.내부의.번역기 업데이트.BackPropagateServerGen(List'1 생성된 값)

시스템에서.데이터. 매핑.갱신하다.내부의.번역기 업데이트.업데이트()IEntityStateManager stateManager, IEntityAdapter 어댑터)

시스템에서.Data.EntityClient.엔티티 어댑터.업데이트()IEntityStateManagerentCache)

시스템에서.데이터.객체.ObjectContext.시스템에서 변경사항 저장(Save Options 옵션).데이터. 엔티티.내부의.내부 컨텍스트.시스템에 변경사항()을 저장합니다.데이터. 엔티티.내부의.게으른 내부 상황.시스템에 변경사항()을 저장합니다.데이터. 엔티티.DbContext.변경사항 저장()

업데이트 DB 상호 작용을 추적했는데 데이터베이스에서 다음 SQL이 성공적으로 실행되고 있는 것 같습니다. EF로 돌아오면 오류가 발생합니다(변경 사항은 커밋되지 않음).

declare 
"COPY_ID" number(10,0); 
"CODS_ID" number(10,0); 
"PERIOD_ID" number(7,0); 

begin 
  update "SCHEMA"."TABLE" 
  set "COLUMN" = :p0 
  where ((("COPY_ID" = :p1) 
  and ("CODS_ID" = :p2)) 
  and ("PERIOD_ID" = :p3)) 
  returning "COPY_ID", "CODS_ID", "PERIOD_ID" into "COPY_ID", "CODS_ID",  "PERIOD_ID"; 

  open :p4 
    for select "COPY_ID" as "COPY_ID", "CODS_ID" as "CODS_ID",           "PERIOD_ID" as "PERIOD_ID" 
  from dual; 
end; 

{ :p0=[Decimal,0,Input]0, :p1=[Int32,0,Input]222222, :p2=[Int32,0,Input]22222, :p3=[Int32,0,Input]222222, :p4=[Object,0,Output]NULL }

다음을 포함해 주십시오.

  • 도면요소 정의
  • 컨텍스트에서 매핑 클래스/구성
  • SQL 테이블 정의

BackPropagate서버Gen

한 건BackPropagateServerGen.

Entity Framework가 데이터베이스에 대해 업데이트를 실행하고 있지만 복합 키 값 중 하나(아마도 COPY_)입니다.ID)는 실제로 UPDATE 호출에 의해 변경되고 있습니다.서버에서 생성된 이 값은 SQL 호출에서 반환되고 있으며, Entity Framework는 이 값 아래에서 키 값이 변경되고 있다고 불평하고 있습니다.

그래서, 나는 당신의 카피를 추측할 것입니다.ID 복합 키 값은 서버에서 생성한 식별자로 정의되지만 다음 중 하나 또는 둘 다 발생합니다.

  • Entity Framework에서 예상하는 바닐라 업데이트를 방해하는 뷰 또는 저장 프로시저에 매핑하는 경우
  • 테이블, 보기 또는 저장 프로시저에 결과를 방해하는 트리거가 하나 이상 있습니다.

트리거가 있는 경우 일시적으로 비활성화하여 문제가 중지되는지 확인합니다.

보기 또는 저장 프로시저에 매핑하는 경우 가능하면 테이블에 직접 매핑해 봅니다.

모든 프로파일링 도구를 사용하여 SQL이 코드에 의해 실행되는 내용을 캡처합니다.

요약

UPDATE 호출이 실제로 데이터베이스에 도달하고 있다고 생각하지만 반환 결과 키 값이 변경되어 Entity Framework가 실패하고 UPDATE 트랜잭션을 롤백할 가능성이 있습니다(사용 중인 EF 버전에 따라).

언급URL : https://stackoverflow.com/questions/31785975/entity-framework-cant-update-data-in-table-with-composite-key-oracle