2013-07-15 1 views
1

"데이터베이스 우선"방식으로 EF5를 사용하여 WPF에서 첫 번째 MVVM 응용 프로그램을 작성하고 있습니다. MVVM의 내 모델은 EF5가 생성 한 것입니다 (T4 템플릿을 사용자 정의하여 INotifyPropertyChanged를 포함해야했습니다).EF5 SaveChanges with MVVM

모든 것이 제대로 작동하는 것처럼 보입니다. 텍스트 상자의 텍스트를 변경하면 내 모델에서 propertychanged가 발생합니다. 이제 이러한 변경 사항을 데이터베이스에 저장하려고합니다. 오류는 없지만 변경 사항은 제출되지 않습니다.

내 viewmodel에서 context.savechanges()를 수행하는 것으로 충분하지 않습니까? 내 XAML에서

private void UpdatePerson() 
    { 
     using (CvContext ctx = new CvContext()) 
     { 
      ctx.SaveChanges(); 
     } 
    } 

내가 가진 :

<UserControl.DataContext> 
    <myViewModels:PersonDetailViewModel/> 
</UserControl.DataContext> 
<TextBox Grid.Row="1" Grid.Column="1" x:Name="txtLastName" Text="{Binding Path=Lastname}"></TextBox> 

내가 edmx 디자이너에서 삭제/삽입/업데이트를 정의 할 필요가 또는이 정말 필요합니까?

미리 도움 주셔서 감사합니다. 감사합니다. YK

답변

1

나는 내 응용 프로그램 내에서 비슷한 것을했습니다. 무언가를 사용해보십시오 아래에있는 것처럼 (저는 보통 저장소를 사용하므로 필요에 맞게 변경합니다);

private void UpdatePerson(PersonViewModel v) 
{ 
    using (ProActiveDBEntities context = new ProActiveDBEntities()) 
    { 
     var p = context.Users.Where(c => c.PersonID == v.PersonID).SingleOrDefault(); //retrieve the person by its PK ID 

     if (p != null) 
     { 
      p.PersonID = v.PersonID; //Map the properties/Fields within your EF model to the ones in your view model 
      p.Surname = v.Surname; 
      //etc... 

      context.SaveChanges(); 
     } 
    } 
} 

내가 말했듯이, 나는 보통 저장소를 사용하여 EF에 대한 CRUD 작업을 만듭니다. 그러나이 메서드 내에서 ViewModel 매개 변수가 있습니다. 그런 다음 엔터티 테이블의 ID를 ViewModel의 ID와 일치시키는 식을 만듭니다. 그런 다음 매핑 된 해당 데이터를 업데이트합니다.

그런 다음 내 ViewModel 내에서 다음을 수행합니다. 예를 들면 다음과 같습니다.

private Void Update() 
{ 
    PersonRepository rep = new PersonRepository(); 
    rep.UpdatePerson(this); 
} 

이것은 이것을 달성하는 나의 방법입니다. 당신이 할 수있는 다양한 방법과 접근법이 있습니다.

내가 놓친 것이 있으면 알려주세요 :). 희망이 도움이! :)

+0

트릭을 많이 주셔서 감사합니다! – user2135342

+0

모델이 데이터베이스에서 직접 나온 경우 각 속성을 수동으로 매핑 할 필요가 없습니다. 모델의 컨텍스트 ('context.Attach (person)')에 데이터베이스를 첨부 할 수 있으며,'context.Entry (person) = EntryState '라인을 호출하여 EF가이 모델에서 변경된 것을 알릴 필요가있다. 수정 됨. –

+0

@Rikkos 말했듯이 - 사람들은 다른 방식으로 그것을 얻습니다. 이 일을하는 방법은 완벽하게 나를 위해 일하고 내 자신의 이익을 위해서 항상 나는 그 무엇이든지 놓치지 않았 음을 보장하기 위해 그 맵핑을 확실히하고 싶습니다. :) 또한, 제 경우에는 모델을 사용하지 않습니다. EF 생성은 제 모델입니다. –