2013-07-15 45 views
1

我正在用“数据库优先”方法使用EF5在WPF中编写第一个MVVM应用程序。 我在MVVM中的模型是EF5为我生成的(我确实需要自定义T4模板以包含INotifyPropertyChanged)。用MVVM EF5 SaveChanges

一切似乎工作正常,更改文本框中的文本引发了我的模型中更改属性。 我正在尝试将这些更改保存到数据库。我没有收到任何错误,但没有提交更改。

恐怕,在我的viewmodel中执行context.savechanges()是不够的?

private void UpdatePerson() 
    { 
     using (CvContext ctx = new CvContext()) 
     { 
      ctx.SaveChanges(); 
     } 
    } 
在我的XAML

我:

<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在此模型中发生了什么变化。 Modified'。 –

+0

@Rikkos就像我说的 - 人们用不同的方式实现它。这种做法对我来说完全有效,为了我自己的利益,我总是喜欢确保它的映射,以确保我没有错过任何东西:)。另外,在我的情况下,我不使用模型。生成EF是我的模型。 –