2010-08-06 6 views
1

강력한 형식의 뷰에서 반환 된 JobCard 개체를 업데이트하는 다음 코드가 있습니다. 그러나 GetModifiedMembers을 JobCard 엔터티로 호출하면 CurrentValueOriginalValue이 모두 현재 값으로 설정된 JobCard의 모든 속성이 반환됩니다.LINQ to SQL 엔터티의 변경 내용 병합

public int Update(BusinessObjects.JobCard model) 
    { 
     Poynting.Installation.DataObjects.LinqToSql.JobCard entity = JobCardMapper.ToEntity(model); 
     using (Database db = DataContextFactory.CreateContext()) 
     { 
      try 
      { 
       //LinqToSql.JobCard origJobCard = db.JobCards.Single(jc => jc.JobID == model.InstallationDBNumber); 
       db.JobCards.Attach(entity, true); 
       db.SubmitChanges(); 

나는 우리가 Attach를 사용하여, 실제로 연결된 개체를 업데이트하지 않기 때문에이 용의자. 이 업데이트는 HttpPost 액션 메소드에 의해 호출되므로 엔티티를 첨부 된 상태로 유지할 수 없습니다. 들어오는 엔티티를 첨부하지 않고 그 값을 사용하여 첨부 된 JobCard 엔티티 (주석 처리 된 행으로 시작)를 업데이트하는 경우 내 감사 서비스가 올바른 변경 사항을 감지합니다.

내 주요 질문은 여기에 있습니다 : entity의 각 속성을 반복하고 해당 속성을 origJobCard에 설정해야합니까, 아니면 어딘가에서 사용할 수있는 일종의 병합 작업이 있습니까?

답변

0

난 당신이 올바르게 여기에 매력이있을 수도 매력이 없을 수도 있습니다 : http 작업 중에 직렬화 (분리) 가져옵니다 원래 엔티티를 제외하고 옵션을 확인했습니다 생각, 당신은 깨끗한 복사/동일한 엔티티의 복제본을 변경하지 않고 http 작업이 완료되면 더럽고 깨끗한 분리 된 엔티티를 Attach(TEntity, TEntity) 메소드로 전달합니다.

분리 된 엔티티에서 연결된 엔티티로 값을 복사하는 것은 실제로 덜 효과적 일 수 있습니다. 그러나 어쨌든 columnProperties을 캐시하고 반복해서 검색하지 않는 한 매우 효율적이지는 않습니다. . 당신이 볼 수 있듯이 귀하의 질문에 거의 6 개월 이후, 나는 주로/코딩 연습 응답이 일을 해요

List<PropertyInfo> columnProperties = typeof(Employee).GetProperties() 
    .Where(p => p.GetCustomAttributes(typeof(ColumnAttribute), true).Any()) 
    .ToList(); 

Employee employee1 = new Employee() { VacationHours = 100 }; 
Employee employee2 = new Employee() { VacationHours = 10 }; 

foreach (PropertyInfo pi in columnProperties) 
{ 
    object value = pi.GetValue(employee1, null); 
    pi.SetValue(employee2, value, null); 
} 

:

여기에 루프 방법의 예입니다. 건배!

[편집]

Automapper 다른 옵션이 될 수 있습니다. 또는 Automapper와 this answer and discussion 같은 전용 뷰 객체.