2011-04-18 2 views
1

다음과 같은 코드가 있습니다. 이 방법은 효과가 있지만 충분히 명확하지 않으며 (수동으로 각 속성을 할당하는) 긴 코드를 작성해야한다고 생각합니다.EF에서 모델 엔티티 인스턴스를 올바르게 업데이트하는 방법은 무엇입니까?

// POST: /TableA/Edit 
[HttpPost] 
public ActionResult Edit(TableA formdata) 
{ 
    TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id); 

    //A foreign key model in another TableB 
    var tbb = myDB.TableB.First(a => a.Id == formdata.TableB.Id); 
    temp.TableB = tbb; 

    //fields in this table 
    temp.field1= formdata.field1; 
    temp.field2= formdata.field2; 
    temp.field3= formdata.field3; 

    myDB.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

내가 초기화 객체와 유사한 몇 가지 코드가 있습니다 : 당신은 TryUpdateModel 방법을 사용할 수 있습니다

TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id) 
    { 
     TableB = myDB.TableB.First(a => a.Id == formdata.TableB.Id), 
     field1= formdata.field1, 
     field2= formdata.field2, 
     field3= formdata.field3, 
    } 

    myDB.SaveChanges(); 
    return RedirectToAction("Index"); 
+0

을 당신이 뭘 하려는지? – hunter

+0

첫 번째 해결책은 추악하다고 생각합니다. 모델을 업데이트하는 좀 더 의미있는 방법을 사용할 수 있습니까? – hbrls

+0

두 번째 해결 방법은 이해가되지 않습니다. 생성자를 호출하지 않을 때는 객체 이니셜 라이저를 사용할 수 없습니다. 첫 번째 해결책은 못생긴 것이 아닙니다 ... – hunter

답변

1

AutoMapper이처럼 쓸 수 즉, 사용 (가능하면 복사하려는 속성에 객체 간의 매핑을 제한하도록 설정해야합니다) :

[HttpPost] 
public ActionResult Edit(TableA formdata) 
{ 
    TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id); 
    temp.TableB = myDB.TableB.First(a => a.Id == formdata.TableB.Id); 

    AutoMapper.Mapper.Map(formdata, temp); 
    myDB.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
+0

예 ... 객체 매핑은 반복 가능한 코드를 제거하는 데 사용할 수있는 것일 수 있습니다. Entity 클래스는 부분 클래스이므로 필요한 모든 기능을 추가 할 수 있기 때문에 확장 메서드 (또는 해당 공용 메서드)도 있습니다. –

+0

그걸 기대하지는 않지만 정말로 Magic! – hbrls

+0

@Robert Koritnik 부분 수업은 내가 원하는 것을 들립니다. 프로젝트 일정이 허락한다면 나는 그것을 시험 할 것이다. – hbrls

1

업데이트 컨트롤러의 현재 값 공급자의 값을 사용하여 지정된 모델 인스턴스 포함 된 속성.

[HttpPost] 
public ActionResult Edit(TableA formdata) 
{ 
    if (ModelState.IsValid) 
    { 
     TableA temp = myDB.TableA.First(a=>a.Id == formdata.Id); 
     if (TryUpdateModel<TableA>(temp)) 
     { 
      myDB.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
    } 

    return View(); 
} 

당신은 당신이 게시되기 전에 폼에 추가되는 편집 할 수 원하지 않는 속성을 방지하기 위해 Controller.TryUpdateModel Method (TModel, String[])를 호출 더 좋을 것입니다. 여기에는 ID 또는 양식을 게시하지 않으려는 다른 입력란이 포함됩니다.

+0

UpdateModel로 매핑 된 내장 된 +1이 충분하다면 외부 솔루션보다 좋습니다. – BrokenGlass

+0

UpdateModel에서 많은 문제가 발생합니다. 그래서'temp.field1 = formdata.field1;'을 반복해서 쓰는 것입니다. EF를 처음 접했으므로 디버그하기가 정말 어렵습니다. 그러나 모두 감사합니다. – hbrls

관련 문제