2013-12-08 3 views
49

Entity Framework에서 분리 된 엔터티 저장에 대한 게시물을 많이 읽었습니다. 이들 모두는 이전 버전의 Entity Framework에 적용되는 것으로 보입니다. 존재하지 않는 것으로 보이는 ApplyCurrentValues ​​및 ChangeObjectState와 같은 메소드를 참조합니다. 변덕에 나는 IntelliSense를 통해 발견하는 방법을 사용하기로 결정하고 나는 무대 뒤에서 일어나는 것을 볼 수 없기 때문에이이 작업을 수행하는 올바른 방법입니다 있는지 확인하려면 :Entity Framework 6에서 분리 된 엔터티 저장

public void SaveOrder(Order order) 
{ 
    using (VirtualWebEntities db = new VirtualWebEntities()) 
    { 
     db.Orders.Attach(order); 
     db.Entry(order).State = System.Data.Entity.EntityState.Modified; 
     db.SaveChanges(); 
    } 
} 

인가 변경된 기존 항목을 업데이트하는 올바른 방법은 무엇입니까?

답변

80

네, 맞습니다. This article describes various ways of adding and attaching entities, 그리고이 예제를 제공합니다

var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" }; 
using (var context = new BloggingContext()) 
{ 
    // The next step implicitly attaches the entity 
    context.Entry(existingBlog).State = EntityState.Modified; 
    // Do some more work... 
    context.SaveChanges(); 
} 

EF는 데이터베이스와는 다른 어떤 속성을 알고하지 않기 때문에, 그것은 그들 모두를 업데이트 할 것입니다 : 당신이 수정 된 상태를 변경

SaveChanges가 호출되면 엔터티의 모든 속성이 수정 된 것으로 표시되고 모든 속성 값이 데이터베이스로 보내집니다.

이러한 문제가 발생하지 않도록하기 위해, 할 수 있습니다 set which properties are modified 수동으로 오히려 전체 엔터티 상태 설정하는 것보다 :

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 
    context.Entry(blog).Property(u => u.Name).IsModified = true;  
    // Use a string for the property name 
    context.Entry(blog).Property("Name").IsModified = true; 
} 
+0

감사합니다. 그래서 나는 단지 명확히하고 싶습니다 ... 이전 버전에서 EF에게 어떤 필드가 변경되었다는 것을 알릴 수있는 것과 같이 더 이상 applycurrentvalues의 개념이 없습니다. – KingOfHypocrites

+1

@KingOfHypocrites 내 대답을 편집 할 수 있습니다. 나는 [EF6 문서] (http://msdn.microsoft.com/en-us/data/ee712907)를 살펴 보길 권합니다. 좋은 예제와 설명이 많이 있으며, 매우 간단합니다. –

+0

링크 주셔서 감사합니다. 귀하의 예제와 함께 유일한 것은 각 속성을 수동으로 표시해야한다는 것입니다. 이전 버전에는 값 적용 방법이 있습니다. 여기에서 새 객체를 가져 와서 이전 객체에 적용 할 수 있습니다. 이렇게하면 변경된 속성을 자동으로 표시하여 저장시 업데이트 할 내용을 알 수 있습니다. 나는 아직도 동급생을 찾고있다. – KingOfHypocrites