2012-03-22 2 views
16
내가 저장소 패턴과 엔티티 프레임 워크, MVC 프로젝트를하고 있어요

가, 지금 내 양식에 내가 샘플 모델EntityFramework 업데이트 부분 모델

SampleModel를
1) 이름
2) 연령
3가) 주소
4) 내가 편집 양식에만 다음과 같은 데이터를 표시하고
5) 날짜가

업데이트 노트
1) 이름
2) 3 세
는) 내가 저장소, 노트를 사용하여 속성 값을 누락 모델을 업데이트 할 경우 지금, dateupdated 필드가 null 간다

을 해결합니다.

제 질문은 어떻게 저장소 (tryupdatemodel 리포지토리에서 사용할 수 없습니다)를 사용하여 몇 가지 선택한 속성을 업데이 트합니까 및 원래 개체를 호출하고 업데이트 된 모델로 properites 매핑 싶지 않아.

방법이있을 수 있습니다.

답변

21

에만 필드의 부분 집합 업데이트 할 수 있습니다

using (var context = new YourDbContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    DbEntityEntry<SameplModel> entry = context.Entry(sampleModel); 
    entry.Property(e => e.Name).IsModified = true; 
    entry.Property(e => e.Age).IsModified = true; 
    entry.Property(e => e.Address).IsModified = true; 

    context.SaveChanges(); 
} 

또는 ObjectContext는 API의 :

using (var context = new YourObjectContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel); 
    entry.SetModifiedProperty("Name"); 
    entry.SetModifiedProperty("Age"); 
    entry.SetModifiedProperty("Address"); 

    context.SaveChanges(); 
} 
+0

오 확인 또는 오른쪽으로 갱신하려면 SQL 쿼리를 작성 :

사용 예제는 것입니까? 또는 편집 된 속성 인 humm ...을 표시하는 일반 도우미를 작성하십시오. TryUpdate가 수행해야하는 작업. – Milan

+0

Entry()가 EF 4.0에 없습니다. – Suncat2000

+1

@ Suncat2000 : 두 번째 예는 EF 4.0에 대한 것이고, 첫 번째 예는 EF 4.1 이상입니다. –

1

이 오래된 스레드이지만, 아무도 관심이 경우, 라디의 솔루션 확장을, 우리 EF 4.1 이상에서 유용한 확장 방법을 찾았습니다.

public static void SetModified<TEntity>(
     this DbEntityEntry<TEntity> entry, 
     IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity 
    { 
     foreach (var expression in expressions) 
      entry.Property(expression).IsModified = true; 
    } 

분명히 y POCO에 대해 같은 이름의 인터페이스를 사용하지 않는 한 IEntity 제약 조건을 제거해야합니다.

 var user = new User 
     { 
      Id = Request.Id, 
      UserName = Request.UserName, 
      FirstName = Request.FirstName 
     }; 

     var expressions = new List<Expression<Func<User, object>>> 
       { 
        x => x.UserName, 
        x => x.FirstName 
       }; 

     context.Entry(user).SetModified(expressions);