2009-12-29 7 views
1

이전 (게시 할 때) 클라이언트 개체를 전달하는 AddClient 페이지를 만들었고 내 리포지토리에서 db.AddToClient (obj)를 사용하여 유지했습니다. 쉬운 물건.엔터티 프레임 워크로 모델 바인딩 (ASP.NET MVC)

이제 "SaveClient"작업에 게시물을 저장하는 세부 정보 페이지가 있습니다. 해당 작업이 실행되기 전에 내 사용자 정의 모델 바인더가 내 Client 개체를 만들고 작업에 편리하게 전달됩니다. 문제는이 클라이언트 개체가 아직 EF 컨텍스트에 연결되어 있지 않다는 것입니다. 그렇게 할 수있는 올바른 위치는 어디입니까? modelbinder에서 또는 컨트롤러에서 가져올 때 또는 저장소 호출을하고 거기에 연결할 때까지 기다릴 것입니까? 권장 프로세스는 무엇입니까?

답변

-1

데이터베이스 작업을 저장소 호출에 넣어야합니다.

모델 바인딩에서 엔터티 프레임 워크 개체에 직접 바인딩합니까? 그렇지 않은 경우 사용자 지정 개체와 엔터티 프레임 워크 개체 간의 매핑을 고려해야합니다.

+0

DB 호출이 저장소에 있습니다.내가 알아 내고자하는 것은 EF를 가장 잘 활용할 수있는 시간이라고 부를 때입니다. 당신의 질문이가는 한, 나는이 질문으로 그것을 결정하려고 노력하고있다. 동시 바인딩과 더 나은 상태를 추적 할 수 있도록 EF 개체를 초기에 쿼리하여 바인드를 모델링하면 EF를 사용하는 것이 가장 좋습니다. – RailRhoad

+0

"모델 바인딩"에 직접 EF 개체를 노출시키지 않고 자체 도메인 개체 또는 DTO를 사용하고 해당 개체를 EF 개체에 매핑합니다. –

0

컨텍스트 외부에서 EF 개체가 생성 된 경우 개체를 컨텍스트에 연결하십시오 ().

참조 : 내가 기억하는 것, 당신이 컨텍스트 개체를 다시 연결하고

수정으로 설정 또는 데이터베이스에서 개체를 다시로드하고 변경 사항을 적용해야합니다 중 하나 http://msdn.microsoft.com/en-us/library/bb896271.aspx

+0

개체를 다 처리 한 후 연결을 기다리는 경우 EF의 동시성 검사의 이점을 잃지 마십시오. 또한 Attach가 내 개체를보고 db에서 최대 하나까지 동기화합니까? – RailRhoad

+0

또한 컨텍스트에 개체를 연결하면 상태가 변경되지 않습니다. 먼저 (모델 바인딩 이전에) 쿼리하고 나서 바인드하자. 그러면 국가의 권리를 적절히 결정할 수 있습니까? – RailRhoad

+0

첨부 된 개체가 새 개체가됩니다. 기존 개체를 업데이트하려면 먼저 데이터베이스에서 개체를 가져 와서 변경 한 다음 변경 내용을 저장해야합니다. –

0

나는이 오래된 스레드 알고 있지만 새로운 독자의 관심 :

를 제출 모델에 대한 EF 개체가 볼 수있는 VS 2012, MVC 4, EF 4.0을 사용하여 내 관찰을 바탕으로

다시 컨트롤러로 양식. 컨트롤러

:

public ActionResult SubmitEFObject(tblData data, FormCollection col) 

"데이터"만 충전도 (@ Html.xxxFor)에 사용되는 특성을 가질 것이다.

"데이터"가 만들어지면 게시 된 FormCollection이 데이터 속성을 설정하는 데 사용되는 것처럼 보입니다. 예를 들어 DataID와 같이 사용되지 않은 속성이 있으면 data.DataID에 null/default 값이 있습니다. 보기에 "@ Html.Hidden (m => m.DataID)"을 추가하면 그 때 DataID가 채워집니다.

// Note: error handling removed 
public tblData MergeWithDB(DBContext db, tblData data, params string[] fields) 
{ 
    tblData d = db.tblData.Where(aa => aa.DataID == data.DataID).Single(); 
    if (fields.Contains("Field1")) d.Field1 = data.Field1; 
    if (fields.Contains("Field2")) d.Field2 = data.Field2; 
    if (fields.Contains("Field3")) d.Field3 = data.Field3; 
    // etc... 
    return d; 
} 

:이 작업을 할 수있는 '빠른 아주 간단한'방법으로

, 나는 데이터베이스에서 '데이터'로 들어오는 '데이터'를 병합하고 병합 된 개체를 반환하는 방법을 만들어 컨트롤러 :

public ActionResult SubmitEFObject(tblData data, FormCollection col) 
{ 
    DataEntities db = new DataEntities(); 
    tblData d = MergeWithDB(db, data, col.AllKeys); 
    db.SaveChanges(); 
} 

대신 모든 IFS의 필드 [] 문자열을 통해 반복하여보다 일반적인 사용하여 반사 또는 어쩌면 더 효율적으로 만들 수 있지만, 내 목적이 '충분'입니다.