2012-01-08 4 views
0

mvc 응용 프로그램에서 내 DB에 액세스하기 위해 아음속을 사용하고 있습니다. mvc 모델 바인딩을 사용하여 레코드를 업데이트하려고하면 열이 아닌 항목이 더티로 표시되어 레코드가 업데이트되지 않습니다.mvc 모델 바인딩을 사용하여 Subsonic 업데이트를 사용하는 방법은 무엇입니까?

수동으로 아톰 코드를 조정하여 모든 열을 더티로 표시하려고했지만 때로는 일부 속성 만 업데이트하여 더티로 표시하지 않으려했습니다.

가장 적합한 방법은 무엇입니까?

public void Update(IDataProvider provider, Boolean forceUpdate){ 
      if(this._dirtyColumns.Count>0 || forceUpdate){ 
       if(forceUpdate) 
        this._dirtyColumns = this.Columns.ToList(); 
       _repo.Update(this,provider); 
       _dirtyColumns.Clear();  
      } 
      OnSaved(); 
     } 

편집 : 나는이 코드를 시도

이 문제가 볼 수

 [HttpPost] 
     public ActionResult Update(mapping m) 
     { 
      m.SetIsNew(false); 
      m.Update(true); // here i tweaked the subsonic code passing true sets all the columns to be dirty and updates the record even though isLoaded=false 
      return RedirectToAction("New"); 
     } 

이 내가 아음속 코드를 쥐게하는 방법입니다

내 작업입니다 거짓말 :

var m = new mapping { ID = 2, Name = "33" }; 
m.SetIsNew(false); 
m.Save(); 

너무 열이 더럽지 않도록 설정되어 있지 않습니다. 개체 이니셜 라이저를 사용할 때 setter가 호출되지 않아 열이 더티로 설정되지 않은 것처럼 보입니다.

기본 mvc.net 모델 바인딩이 이런 식으로 작동한다고 가정하므로 레코드가 업데이트되지 않는 이유입니다.

편집 2

내 첫 편집 dyork12 지적으로 @ 잘못된 것입니다. Subsonic은 'isLoaded'플래그를 사용합니다.이 플래그가 false로 설정되면 속성을 더티로 설정하지 않습니다. 이것은 레코드를로드 할 때 아음속에 의해 사용되며 로딩이 더티로 설정되지 않는 동안 속성을 설정하도록합니다.

하지만 내 질문은 자동 모델 바인딩을 사용하여 mvc.net보기에서 아음속 개체를 편집하는 가장 좋은 해결 방법은 무엇입니까 남아 있습니다.

+0

보기에서 SubSonic 생성 객체를 바인딩하거나 ViewModel을 사용하고 있습니까? 당신은 이것을 본 적 있습니까? http://stackoverflow.com/questions/5491733/subsonic-and-automapper-dirtycolumns-collection-is-empty-therefore-cant-updat – DaveHogan

+0

왜 더럽지 않은 것으로 표시되어 있습니까? 이 코드 조각은 ActiveRecord에서 가져온 것이므로 열 속성에 바인딩하면 올바르게 작동합니다. 너 뭐 다르게하고있어? 제발 더 많은 코드. –

+0

@ dyork12 : 나는 '편집'에 대답했다. – Daniel

답변

0

그래서 원래 문제가 (지금 이해로) MVC는 어떻게 든 설정하지 않고 그들을 위해 DAL 객체를 행을로드하고 생성하는 것입니다 isLoaded 플래그를 지정하면 setter에 대한 모든 호출이 dirtyColumns 목록에 추가되지 않습니다. setter가 호출되기 전에 레코드가로드되고 DAL 객체가 생성 된 후 isLoaded를 설정하는 방법을 찾아야합니다.

죄송합니다. MVC를 잘 이해하지 못하고 해당 부분에 대한 코드를 포함하지 않았습니다. 어떤 종류의 이벤트를 삽입하거나 무언가를 상속 받거나 템플릿을 수정하거나 뭔가를 기대합니다. isLoaded를 설정하는 방법을 찾 자마자 문제를 해결할 수 있습니다. 나는 희망.

+0

감사합니다. 나는 이것이 갈 길이라고 생각합니다. 하지만 isLoaded 플래그 작동 방식이 내 마음에 들리면 직관적이지 않습니다. 아음속이 DB에서 레코드를로드 할 때 문제가 발생하면로드 플래그를 설정하고 완료되면 설정을 해제해야합니다. 아음속 사용자에게는 보이지 않아야합니다. – Daniel

+0

로드 된 플래그와 더티 플래그를 갖는 것이 일반적인 패턴입니다. 로드 된 플래그는 행이 데이터베이스에서 검색되었음을 나타냅니다. 더러운 깃발은 그것이 수정되었다고 말한다; 함께 모든 조합을 다룹니다. 제공된 API를 사용하지 않고 행을로드/저장하려는 경우 필요에 따라 해당 플래그를 이해하고 유지 관리해야합니다. 저장/업데이트가 올바르게 작동하도록 설정해야합니다. –

1

나는 펀트를 가져갈 것이고 그 대답은 _isLoaded가 거짓이라고 대답한다고 말할 것이다. 더 많은 코드가 없어도 이유를 말할 수는 없습니다.

새 레코드를 만들면 _isNew가 true이고 _isLoaded가 false입니다. 저장하면 INSERT가 수행되고 더티 (dirty) 열은 무시됩니다.

기존 레코드를로드하는 경우 _IsNew는 false이고 _isLoaded는 true입니다. 저장하면 UPDATE가 수행되고 더티 (dirty) 열만 업데이트됩니다.

코드 조각은 _isNew false를 설정하지만 _isLoaded는 true로 설정하지 않습니다. 열이 더티로 표시되지 않으므로 저장하지 않습니다. ActiveRecord 생성 코드를 읽으면 쉽게 알 수 있습니다.

는 [BTW 당신은 ​​세터에 대한 잘못된 것 - 그들이 객체 initialiser에 의해 호출됩니다.]

+0

감사합니다. 나는 나의 실수를 바로 잡기 위해 나의 질문을 편집했다. 내가 게시 한 코드는 모든 코드 '매핑'은 mvc.net의 자동 모델 바인딩에 의해로드 된 아음속 개체이며 그 다음에 업데이트됩니다. isLoaded를 true로 설정해도 속성이 더럽지 않으므로 도움이되지 않습니다. 자동 바인딩을 사용할 수있는 방법이 있습니까? – Daniel