从WPF中的视图更新EF模型

时间:2017-03-23 09:52:55

标签: c# wpf entity-framework mvvm

我在WPF应用程序中有一个主窗口和一些子窗口。使用MVVM和EF。 以下是图层的简要概述:

  • MainView:这里有一个GridView和一个保存按钮。
  • MainViewmodel:具有ObservableCollection属性和保存的DelegateCommand。
  • ChildView:这里有一个GridView和一个保存按钮。
  • ChildViewmodel:具有ObservableCollection属性和用于保存的DelegateCommand。
  • DataServices:使用EF模型提供Entitytype1和Entitytype2

以下是对代码的简化概述(与Child视图相同):

MainView中的XAML

<Window>
   <UserControl.DataContext>
      <viewModel:MainViewModel/>
    </UserControl.DataContext>
    <Grid>
       <GridView ItemsSource="{Binding MyEntityList}"/>
       <Button Content="Save" Command="{Binding SaveCommand}"/>
   </Grid>
</Window>

MainViewmodel中的代码

public ObservableCollection<Entitytype1> MyEntityList { get; set; }
private void LoadData()
{
   MyEntityList = new ObservableCollection<Entitytype1>(DataServices.GetData());
   OnPropertyChanged("MyEntityList");
}

SaveCommand = new DelegateCommand(Save);
private void Save()
{
   DataServices.SaveEntity1();
}

DataServices中的代码 我在需要时创建了EF模型,我想在应用程序的整个生命周期中都有一个EF挂起。这是一个坏主意吗?

public static IList<EntityType1> GetData()
{
   var list = new List<EntityType1>();
   using (var myEntitiesModel = new MyEntitiesModel())
   {
       list = myEntitiesModel.EntityType1s.ToList();
   }
   return list; 
}

public static SaveEntity1(?)
{
   ????
   myEntitiesModel.SaveChanges();
}

所有这一切都正常,数据显示在Mainview的网格中。

现在提出问题:如何将数据恢复到数据库?

当用户更改网格中的某些内容时,它会在ObservableCollection中使用Bindings进行更改,很好。

但是当用户点击视图上的保存按钮时,如何将更改返回到DataServices中的EF模型,以及返回数据库?

我想我可以在DataServices中创建一个方法,将ObservableCollection放入并覆盖它,并将其中的项目与EF模型中的所有项目进行比较,以找到更改后的项目。

但这似乎不对,什么是更好的方式?

2 个答案:

答案 0 :(得分:1)

我几乎不建议不要将模型绑定到View。您应该只将ViewModels绑定到View。看看MVVM模式。

当您通过EF从数据库加载数据时,您将获得一个项目列表。如果遍历此列表,则可以为每个条目创建ViewModel,并且每个ViewModel都可以存储从中创建的EF模型。保存数据时,您可以遍历ViewModel并获取更新的EF模型。当您创建了新的ViewModel(没有EF模型)时,您可以创建一个新的EF模型。

在我看来,这是一个非常干净的方法,并且在我开发WPF应用程序近10年后为我工作。

答案 1 :(得分:0)

  

我在需要时创建了EF模型,我想在应用程序的整个生命周期中都有一个EF。这是一个坏主意吗?

这取决于。在企业应用程序中,客户端应用程序不应该首先依赖实体框架。您通常使用数据访问层(DAL)或服务或业务层与数据库进行通信,而服务或业务层又在后台调用DAL。 EF仅存在于DAL中,客户端应用程序只调用服务层的某些方法来读取和写入数据。它对EF一无所知,客户端也没有DbContext

在一个小应用程序中,可能可以在视图模型或整个应用程序的生命周期中使用单个DbContext。在这种情况下,您可以创建MyEntitiesModel的单个实例,使用此上下文中的实体填充ObservableCollection<T>,然后调用同一SaveChanges()实例中的DbContext方法。您的视图模型的Save()方法。

  

我想我可以在DataServices中创建一个方法,将ObservableCollection放入并覆盖它,并将其中的项目与EF模型中的所有项目进行比较,以找到更改后的项目。

     

但这似乎不对,什么是更好的方式?

您还可以将断开连接的实体附加到新的DbContext实例,并设置附加实体的状态。有关详细信息,请参阅以下博文:https://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework/