엔티티 프레임 워크 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 제품 컬렉션에있는 다른 항목입니까?
유효성 검사 예외라는 것을 알고 있습니다. 검증 자체 (또는 추적)가 잘못되었다는 것입니다. – f470071
죄송합니다. 대답을 업데이트하고 있습니다. –
흠. 귀하가 제공 한 링크는 dbContext.Configuration.ValidateOnSaveEnabled = false를 사용하여 제안 된 대답과 관련이있을 수 있습니다. 해결책은 아니지만 적어도 해결 방법은 있습니다. 수정 된 속성은 여전히 유효해야합니다. 그러나 그것은 일시적인 해결책이며, 코드를 미리 업데이트하여 업데이트 할 것입니다. 반 유용 링크와 검색 구문 "부분 업데이트"를 제공하는 데 도움이됩니다. – f470071