我正在使用EF5和“数据库优先”方法在WPF中编写第一个MVVM应用程序。
我在MVVM中的模型是EF5为我生成的(我确实需要自定义T4模板以包括INotifyPropertyChanged)。
一切似乎都可以正常工作,更改文本框中的文本会引起模型更改的属性。
我现在正在尝试将这些更改保存到数据库。我没有收到任何错误,但未提交更改。
恐怕在我的 View 模型中执行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设计器中定义插入/更新/删除,或者这真的不是必需的吗?
在此先感谢您的帮助!
最好的祝福,
K
最佳答案
我在应用程序中做了类似的事情。尝试以下类似的操作(我通常为此使用存储库,因此请进行更改以满足您的需求);
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);
}
这是我实现这一目标的方法。您可以采取不同的方式和方法。
如果我错过了什么,请告诉我:)。希望这对您有所帮助! :)
关于c# - MVVM的EF5 SaveChanges,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17653472/