2012-01-09 3 views
2

단순히 엔터티를로드하고 속성을 수정 한 다음 다시 데이터베이스에 저장하려고합니다. 필요하며 나는 Find()을 수행 할 때 분명히로드되지 않습니다 뉴스 레터 개체의 일부 속성이 있기 때문에Entity Framework에서 엔터티의 속성을 수정하면 유효성 검사 오류가 발생합니다.

var db = new NewsletterContext(); 
var newsletter = db.Newsletters.Find(x => x.ID==newsletterID); 
newsletter.SomeProperty = 5; 
db.SaveChanges(); 

이 유효성 검사 오류가 발생합니다.

은 내가 Where() 다음 각 필수 속성에 대한 Include()를 사용하여이 문제를 해결 할 수 있습니다

var db = new NewsletterContext(); 
var newsletter = db.Newsletters.Include(x => x.RequiredProp1) 
        .Include(x => x.RequiredProp2).Include(x => x.RequiredProp3) 
        .Where(x => x.ID==newsletterID) 
        .FirstOrDefault(); 
db.SaveChanges(); 

이것은 매우 우아한 해결책이 아니라 내가이 Newsletter 객체에 더 필요한 속성을 추가 할 경우 중단됩니다.

더 좋은 솔루션이 있습니까?

+0

예, 미안합니다. RequiredProp1 등은 실제로 관련 엔티티입니다. 뉴스 레터 엔티티 자체가 잘로드되고 모든 특성을 읽을 수 있지만 다시 저장하면 오류가 발생합니다. – Judo

+0

MVC 3 앱에서 .NET 4.0을 사용하는 EF 4.1 코드. – Judo

답변

6

Entity 프레임 워크는 유효성 검사를 수행 할 때 지연로드를 비활성화합니다. 따라서 탐색 속성에 필요한 유효성 검사를 수행하면 유효성 검사가 실패합니다. 대신 탐색 속성과 관련된 스칼라 속성을 꾸밀 수 있습니다.

+0

데이터베이스에 다른 (아마도 불필요한) 필드를 추가하지 않습니까? 프로그래밍 방식으로 유효성 검사를 위해 lazyloading을 설정하는 방법이 있습니까? – Judo

+0

@Judo 유효성 검사에 대한 지연로드는 정확한 이유 때문에 비활성화되었습니다. 불필요한 지연로드를 피하십시오. 이 경우 스칼라 속성을 갖는 것이 편리합니다. 데이터베이스에 필드를 추가하지 않습니다. – Eranga

1

가 foriegn 키를 사용하여 모델을 오염 싶지 않아

public class Foo 
{ 

    [Required] 
    public int? RequiredScalarId { get; set; } 

    public virtual Bar RequiredNavigationalProp { get; set; } 
} 
? 좋은! 읽어. NewsletterContext에서 SaveChanges 메서드를 재정의 할 수 있습니다. 다음 샘플 구문을 사용하여 모든 게으른로드 프로퍼티들과 콜렉션을로드, 수정 된 모든 개체 및 사용하여 반사를 가져 오기 : 그것은 소리

db.Entry(newsletter).Reference(n => n.RequiredProp1).Load(); 
db.Entry(newsletter).Collection(n => n.RequiredCollec1).Load(); 

그것은 쉽지 않을 것이다, 그러나 당신이 그것을 쓴되면, 그것은 것 그것이 원활하게 작동하는지 잘 보시라. :)

관련 문제