2011-03-30 4 views
2

asp.net MVC3 프로젝트에서 Subsonic 3 및 Automapper를 사용하고 있습니다.Subsonic 및 Automapper - dirtyColumns 컬렉션이 비어있어 업데이트 할 수 없습니다.

내 HttpPost ActionResult에서 내 모델을 가져 와서 Subsonic 생성 엔터티에 매핑하고 있습니다.

매핑이 문제없이 작동하지만 엔티티를 업데이트 할 수 없습니다.

더 자세히 살펴보면 더티 컬럼이 없기 때문에 Subsonic이 아무것도 업데이트 할 필요가 없다고 생각하여 Update() 호출이 실패합니다.

코드로드가 다시 지그재그로 바뀌 었습니다. 모델에서 매핑하기 전에 메소드가 db에서 다시 엔티티를로드하도록 강요했습니다. 매핑이 dirtyColumns 추적을 파괴하는 것 같습니다. 예 : DB에서로드 한 후 매핑 한 다음 임의의 속성을 변경하면 더티 형 열로 표시되지 않습니다.

또한 SetIsLoaded (true) 메서드 호출을 사용해 보았습니다. 맵핑 후 기쁨이 없습니다. 내 PersonRepository에

[HttpPost] 
    public virtual ActionResult Edit(SinglePersonModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      Data.Person person; 

      //Now Map my model to my entity - this works 
      Mapper.CreateMap<SinglePersonModel, Data.Person>(); 
      person = Mapper.Map<SinglePersonModel, Data.Person>(model); 

      //THIS DOESN'T SET MY COLUMN TO DIRTY 
      person.Link = "asdjsadij"; 

      //THIS DOESN'T SET MY COLUMN TO DIRTY EITHER 
      person.SetIsLoaded(true); 
      person.Link = "asdjsadij"; 

      if (person.PersonId > 0) 
       PersonRepository.UpdatePerson(person); 
      else 
       PersonRepository.CreatePerson(person); 

      return RedirectToAction(MVC.SecureAdministration.Person.Index()); 
     } 
     else return View(model); 
    } 

정적 방법은 단지 각각 아음속의 업데이트() 및 저장()를 호출 :

여기 내 방법입니다.

어떤 아이디어라도 높이 평가할 수 있습니다. 필자는 모델에 오토 맵퍼가 엔티티로 이월되도록 추가 속성을 추가해야 할 필요가 있다고 생각합니다.

최악의 경우 모델에서 엔티티로 다시 매핑 할 때 Automapper를 사용하지 않아야합니다.

+0

을 도와 -하지만 그건이 조금 :)

감사합니다 도움이 될 생각 소스 위치의 person 엔티티가 먼저 automapper를 사용하여 업데이트 할 때 dirty로 표시됩니다. – Buildstarted

+0

예 아니요. 엔터티를 다시로드 한 다음 속성을 업데이트하면 더티로 표시됩니다. (어쨌든 다시 DB에서 엔티티를로드하는 것을 피하고 싶습니다.) 그러나 엔터티를 다시로드 한 다음 매핑하면 아무 것도 더티로 표시되지 않습니다. automapper가 대상 객체에서 덮어 쓰는 것에서 너무 잔인한 것처럼 보입니다. 어쨌든 소스에서 다시로드하지 않고 더티 컬럼을 얻을 수 있습니다. person.SetIsLoaded (true)를 호출하면됩니다. 다시 말하지만, 이것은 속성을 업데이트 할 때 작동하지만 매핑 할 때 작동하지 않습니다. –

+0

'AutoMapper.Mapper.Map (모델, 사람);'- 이렇게 해 보셨습니까? 이것은 객체의 새로운 인스턴스를 할당하지 않고 기존 객체에 할당합니다. 그냥 생각. 나는 DB에서 그것을 로딩하지 않기를 바란다. 그러나 이것은 조금 도움이 될 것이라고 생각했습니다 :) – Buildstarted

답변

1

AutoMapper.Mapper.Map<SinglePersonModel, Data.Person>(model, person); -이 기능을 사용해 보셨습니까? 이것은 객체의 새로운 인스턴스를 할당하지 않고 기존 객체에 할당합니다. 그냥 생각. 나는 DB에서 그것을 로딩하지 않기를 바란다. ** 기쁘다 내가 완전히 확실하지 않다 (I가 음속 사용하지 않은)하지만 당신의 경우 ** 부하를 생각 :)