2

우리는 EF STE를 한동안 사용해 왔지만 응용 프로그램이 상당히 많이 성장하여 새로운 4.1 DbContext를 고소하기로 결정했습니다. 우리의 데이터 계층은 다른 유형을 사용하지 않아도됩니다.EF 4.1 DBContext 및 탐색 속성

일을하는 DbContext 방식에 대한 초등 평가에서 나는 약간의 문제에 직면하고 있습니다.

나는 쿼리하는 데 사용하고 있고 예압 같은 관련 데이터를 필요 :

return context.Orders.Include("Detail").SingleOrDefault(ord => ord.ID == ID); 

그리고 수정의 UI에 반환 된 객체를 전송하고, UI에서 돌아 왔을 때 데이터베이스에 변경 사항을 저장합니다. 내가 DbContext에서 "절약 변화"를하고, 지금까지 읽은 내용에서

쉽게 다음과 같은 코드를 사용하여 수행됩니다 :

context.Entry(order).State = EntityState.Modified; 

이 코드의 문제는 실제로 객체와의 모든 속성을 표시한다는 것입니다 내 모델 (비즈니스 규칙)의 일부 속성에 허용되지 않는 항목이 수정되었습니다.

context.Orders.Attach(order); 

DbEntityEntry<Order> ordEntity = context.Entry(order); 

string[] arr = 
{ 
     ordEntity.Property(ord => ord.ID).Name, 
     ordEntity.Property(ord => ord.ClientID).Name, 
}; 

foreach (string prop in ordEntity.OriginalValues.PropertyNames) 
{ 
     if (!arr.Contains(prop)) 
     { 
      ordEntity.Property(prop).IsModified = true; 
     } 
} 

context.SaveChanges(); 

내가 문제를 :

나는 (! 변하지에 수정 된 속성 상태가 지원되지 않는 변경, BTW 상대적으로 작은 요구 사항에 대한 코드를 많이 요구하는 것) 다음과 같은 솔루션에 의존 이 코드에 직면하면 "Attach"문이 아무 것도 변경되지 않은 경우에도 첨부 된 객체의 탐색 속성에 일종의 충돌이 있다는 예외를 던지고 있습니다. (데이터베이스에서 검색 한 것과 똑같이 객체 저장). 오류 메시지는 다음과 유사합니다. " 'OrdersDatamodel.FK_Order_Detail'관계의 'Detail'역할에 대한 충돌이 감지되었습니다."

질문은 다음과 같습니다

  1. 특정 개체 속성의 수정을 방지하기위한 더 "우아한"방법이 있나요?
  2. 누구나 컨텍스트에 개체를 연결할 때 발생하는 예외 상황을 아는 사람이 있습니까?

감사합니다. 내가 DbContext에서 "절약 변화"를하고, 지금까지 읽은 내용에서

+0

누구든지 도와주세요. – wassim

답변

2

쉽게 다음과 같은 코드를 사용하여 수행됩니다 :

context.Entry(order).State = EntityState.Modified;

당신은 거의 명시 적으로 상태를 설정할 필요가 없습니다. 특성을 수정할 때 virtual이라고 가정하면 사용자가 설정하지 않아도 상태는 자동으로 Modified으로 변경됩니다. 그렇지 않은 경우 SaveChanges으로 전화하는 동안 DetectChanges이 전화를받습니다.

+0

이 코드를 더 이상 사용하지 않습니다. 내 질문에 언급했듯이 수동으로 컨텍스트 (개체를 "Unchanged"상태로 유지)에 개체를 연결 한 다음 수동으로 변경할 수있는 속성을 표시해야했습니다. 어쨌든 고마워. – wassim

+0

하지만 제가하려는 것은 비 문제를 해결하려고한다는 것입니다.엔티티/속성을 수정 된 것으로 수동으로 표시 할 필요가 없습니다. EF가이를 대신하기 때문입니다. – hvd

+0

당신이 이야기하고있는 out-of-the-box 동작의 문제점은 모든 속성을 수정할 수 있다는 것입니다. 특정 속성의 수정을 허용 할 수 없기 때문에 지정된 속성 집합 만 수정 됨으로 플래그가 지정되도록해야합니다 (플래그 지정이 자동 또는 수동으로 발생하는지 여부는 실제로 문제가 아닙니다.) 읽기 전용 속성을 "해제"하지 못했습니다!). – wassim