2017-05-07 11 views
0

엔티티 프레임 워크 5.0을 사용하고 있습니다. 나는 ObjectContext에서 DbContext 모델로 내 앱을 변경하는 중입니다. DbContext는 Microsoft의 권장 방법에 따라야합니다. 나는 데이터베이스 forst 접근법을 사용하고 모델 양식 데이터베이스를 생성했다. 그러나 아주 간단한 첫 번째 작업에는 문제가 있습니다. 즉, 레코드의 간단한 갱신이 깨졌습니다.부분 업데이트 작업을 ObjectContext에서 DbContext로 전환하는 방법

는의는 ilustration입니다에 대한 간단한 테이블 항목을 보자 :

Item 
(
    ItemId int NOT NULL, -- Primary key 
    Name nvarchar(50) NOT NULL, 
    Description NVARCHAR(50) 
) 

나는 DbContext를 사용하여 ObjectContext는이하지 않습니다으로 기록을 갱신 지원하지 않는 것으로 나타났습니다. 내 응용 프로그램에는 간단한 업데이트 방법이 있습니다.

public void UpdateItem() 
{ 
     MyContext context = new MyContext(); 
     Item item = new Item(); 
     item.ItemId = 666; 
     context.Items.Attach(item); 
     // From this point onward EF tracks the changes I make to Item 
     Item.Description = "Some description"; 
     context.SaveChanges(); 
} 

이 메서드는 Object를 사용하여 레코드를 올바르게 업데이트합니다.

System.Exception: Items.aspx.cs - logged from CustomError() ---> System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. 
    at System.Data.Entity.Internal.InternalContext.SaveChanges() 
    at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 
    at System.Data.Entity.DbContext.SaveChanges() 

: 그러나 나는 내가 예외를 얻을 DbContext에서 같은 일을하려고,이 같은 것을 생성하는 볼 (크게 간소화를!)

UPDATE Item 
SET Description = 'Some description' 
WHERE ItemId = 666 

하면 SQL 프로파일 러를 수 사용 그리고 데이터베이스 UPDATE SQL 서버에 발급됩니다. DbContext가 모든 속성의 유효성을 검사하고 Name 속성이 null 인 것 같습니다. 이것은 의도적으로. 나는 그것을 고치려고하지 않고, 나는 그것이 무엇인지 알지 못한다. 나는 그것이 무엇인지 알 필요가 없다. 설명 특성 만 변경되었습니다. 분명히 ObjectContext는 변경 사항을 올바르게 추적하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

나는이 문제를 조사하고 레코드를 업데이트 할 때 뭔가를 발견했다. 예를 들어 링크 : https://stackoverflow.com/a/15339512/4601078

db.Users.Attach(updatedUser); 
var entry = db.Entry(updatedUser); 
entry.Property(e => e.Email).IsModified = true; 
// other changed properties 
db.SaveChanges(); 

그러나이 끔찍한 코드입니다. 의 모든 속성 것은 같은 줄을 추가한다 : 이것은 추한 읽을 수없는 코드를 생성

entry.Property(e => e.Email).IsModified = true; 

를, 내가 람다 식을 의심 성능이 stelar 수 없습니다.

DB 로의 왕복 여행을 제안하는 사람들은 모든 속성이 채워진 기존 레코드를 가져오고 업데이트하고 변경 사항을 저장합니다. 이는 성능면에서 아무런 의미가 없습니다.

간단한 엔티티 업데이트를 다루는 방법이나이 DbContext는 실제 용도로 사용되지 않는 막 다른 골목의 Microsoft 제품 컬렉션에있는 다른 항목입니까?

답변

1

DbContext는 속성을보고 변경 내용을 추적하지 않지만 이전에 알려진 값과 값을 비교합니다. 유효성 검사는 항상 전체 엔터티에서 작동하므로이 방법으로 작업하려는 경우 유일한 선택은이 작업 중에 유효성 검사를 사용하지 않도록 설정하는 것입니다.당신이 확실에 대한 을 알고 있다면 당신은 유효, 또는 당신이 그들을 확인하는 사용자 지정 코드를 적용 변경, 당신은 모두 EF에 의해 검증을 해제 할 수 있음을 Entity Framework validation with partial updates

+0

유효성 검사 예외라는 것을 알고 있습니다. 검증 자체 (또는 추적)가 잘못되었다는 것입니다. – f470071

+0

죄송합니다. 대답을 업데이트하고 있습니다. –

+0

흠. 귀하가 제공 한 링크는 dbContext.Configuration.ValidateOnSaveEnabled = false를 사용하여 제안 된 대답과 관련이있을 수 있습니다. 해결책은 아니지만 적어도 해결 방법은 있습니다. 수정 된 속성은 여전히 ​​유효해야합니다. 그러나 그것은 일시적인 해결책이며, 코드를 미리 업데이트하여 업데이트 할 것입니다. 반 유용 링크와 검색 구문 "부분 업데이트"를 제공하는 데 도움이됩니다. – f470071

0

참조 :

db.Configuration.ValidateOnSaveEnabled = false; 

이 같은 확인 작업 오래도록 할 수있는 한 : 알려진 ID (별칭 : 스터브 엔터티)를 가진 새 엔터티를 연결 한 다음 속성을 수정하십시오. EF는 변경된 것으로 감지 된 속성 만 업데이트합니다 (변경 사항 알림에 의해 ObjectContext에서와 같이 원래 값과 현재 값을 비교하여 실제로 변경됩니다). 엔티티 자체를 수정 된 것으로 표시하면 안됩니다.

EF의 유효성 검사를 사용하지 않고 개별 속성을 수정 된 것으로 표시하고 싶지 않으면 this이 유용한 대안이 될 수 있다고 생각합니다.