2017-12-27 17 views
0

에 뷰 모델을 매핑 :올바르게 나는 내 개체가 개체

//This is called from my view via ajax 
public void Save(UserViewModel uv) 
{ 
    // this throws error: cannot convert from UserViewModel to Entity.User 
    MyRepository.UpdateUser(uv); 
} 

: 내 UserViewModel이

public class User 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

public string Address { get; set; } 
} 

public class UserViewModel 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Address { get; set; } 
} 

내 컨트롤러에서이 다음과 같이 사용하고 같은 저장소 클래스의 내 UpdateUser는 다음과 같습니다.

,210
public void UpdateUser(User u) 
    {   
    var user = GetUserDetails(u.Id); 

    user.Name = u.Name; 
    user.Address = u.Address; 

    //using entity framework to save 
    _context.SaveChanges(); 
    } 

내가 제대로 저장소 안에 내 개체

당신은 속성 값의 매핑하고있는
+0

올바른 방법은 아래에서 설명하는대로 AutoMapper를 사용하고 있다고 생각합니다. 내 대답을보고 내 의견을 알려주세요. – Aria

답변

0

당신이 뭔가를 할 수 AutoMapper를 사용하여 : 당신은 객체가 다른 컨텍스트에서 만든 경우 문제가 없는지 확인하기 위해 객체를 첨부 할 수 있습니다

보기 모델과 모델을 변경하면 코드를 수동으로 변경하는 것이 좋지 않지만 Automapper을 사용하면 코드를 변경하려면

EDIT1 :

이 저장소 (DATAACCESS 코어)에서 모델보기를 사용하지 않는 것이 좋습니다 그래서 당신의 public void UpdateUser(User u)을 유지하기 위해 더 나은 것하고 더 나은입니다 외부에서 변경하지 마십시오 이전에 수행했던 것과 같은 user에서 UpdateUser이 아닌 UserViewModel을 전달하십시오.

가 EDIT2 : 대답 게시물의 내 ​​의견 비는 SOC (우려 분리)도 내 관련이없는에서

...

1 내가 UserViewModel을 통과 I 위반 한 SOC ....

2- 나는 반대편에서 Peresentation 계층의 사용자를 직접 얻었 는데도 SOC를 위반했습니다.

나는 가장 좋은 방법은 프록시로 중간 계층 ....

프리젠 테이션 < ----> 프록시 < ----> 저장소라고 생각합니다.

1

(뷰 모델 ->를, 엔티티 모델) UpdateUser 방법 내 컨트롤러에 UserViewModel를 매핑 할 수있는 방법. 따라서 뷰 모델 클래스 (UserViewModel)를 매개 변수 유형으로 사용하십시오.

public void UpdateUser(UserViewModel u) 
{   
    // Get the entity first 
    var user = GetUserDetails(u.Id); 

    // Read the property values of view model object and assign to entity object 
    user.Name = u.Name; 
    user.Address = u.Address; 

    //using entity framework to save 
    _context.SaveChanges(); 
} 

이제 Save 메서드에서 뷰 모델 객체를이 메서드에 전달할 수 있습니다.

이 질문은의 현재 문제 인 컴파일 시간 오류 ()를 수정하지만 어떤 계층에서 어떤 클래스를 사용하고 있는지주의해야합니다. 데이터 액세스 계층에서 뷰 모델 클래스를 사용하는 것에 대해 너무 걱정한다면 중간 서비스 계층에서이를 수행 할 수 있습니다. 그러나 그 레이어에서 엔티티 모델을 얻고 거기에서 업데이트를 수행합니다.

기억하십시오, 해당 질문에 대한 확실한 대답이 없습니다. 읽기 쉽고 프로젝트/팀과 일관된 접근 방식을 사용하십시오. 가끔 "일반적인 DTO 클래스"라는 용어를 "모델보기"보다 자주 사용하여 다른 레이어로 그 파일을 평화롭게 전달할 수 있습니다. 나는 그들을 별도의 프로젝트 (Common DTO라고 불림)에 두었고, 이것은 다른 프로젝트를 교차하여 절단 될 것입니다. 즉,이 공용 DTO 프로젝트에 대한 참조를 웹/UI 레이어와 데이터 액세스/서비스 레이어에 추가하고 필요에 따라이를 사용합니다.

+0

UpdateUser 메소드가 mu 데이터 프로젝트의 일부인 내 저장소 클래스에 있고 UserViewModel이 webproject의 일부입니다. 나는 이것이 당신이 언급 한 바대로 올바른 방법이라고 생각하지 않습니다. – aman

+0

예. 그래서 당신 스스로를 만들어야한다는 부름입니다. 어떤 계층까지가는 클래스 (이 질문에 대해 확실한 답이 없음). 내 대답은 현재 컴파일 오류를 해결하는 것입니다. 어느 계층이 어떤 계층인지 결정하는 것은 당신에게 달려 있습니다. 종종, 뷰 모델 대신에 Common DTO 클래스를 호출합니다.이를 통해 심층으로 전달할 수 있습니다. – Shyju

+0

이러한 공통 DTO 클래스를 별도의 DTO 프로젝트로 옮기고 웹 및 데이터 액세스 프로젝트에서 참조하는 경향이 있습니다. – Shyju

1

저장소는 User 유형의 객체를 처리하므로 값을 해당 유형의 인스턴스로 다시 매핑 한 다음 호출해야합니다.

public void Save(UserViewModel uv) 
{ 
    var user = MyRepository.GetUser(uv.Id); 
    user.Name = uv.Name; 
    user.Address = uv.Address; 
    MyRepository.UpdateUser(user); 
} 

당신은 다음 저장소 클래스의 변경 사항을 저장할 수 있습니다 : 당신을 가정

GetUser라는 사용자를 얻을 수있는 방법이있다. 수동으로

public void Save(UserViewModel uv) 
{ 
    // this throws error: cannot convert from UserViewModel to Entity.User 
    var config = new MapperConfiguration(cfg => { 

       cfg.CreateMap<UserViewModel , User>(); 

      }); 
    User u = config.CreateMapper().Map<User>(uv); 
    MyRepository.UpdateUser(u); 
} 

또는 :

public void UpdateUser(User u) 
{  
    _context.Users.Attach(u); 
    _context.Entry(u).State = EntityState.Modified; 
    _context.SaveChanges(); 
} 
+0

'User'는'Save'에서'UserViewModel '로 전달 될 수있는 이유는 무엇인가요? – Aria

+0

@Aria :'UserViewModel' 클래스는 다음에 속합니다. 프레젠테이션 레이어 저장소에는 사용자보기에 대한 지식이 없어야합니다. 우려의 분리. – JuanR

+0

예 SOC에 따르면 리포지토리는 프리젠 테이션 계층에 대해 알지 못합니다. 즉, 'UserViewModel'대신 Id를 사용하면 문장과 코드가 더 가까워집니다. – Aria