我在WPF应用程序中有一个主窗口和一些子窗口。使用MVVM和EF。 以下是图层的简要概述:
以下是对代码的简化概述(与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模型中的所有项目进行比较,以找到更改后的项目。
但这似乎不对,什么是更好的方式?
答案 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/