1

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

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

恐怕,在我的视图模型中执行 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

4

1 回答 1

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);
}

这是我实现这一目标的方式。您可以采取不同的方式和方法。

如果我错过了什么,请告诉我:)。希望这有帮助!:)

于 2013-07-15T12:00:48.120 回答