将实体框架数据库第一个数据库上下文与mvvm视图模型类一起使用
本文关键字:数据库 模型 一起 视图 框架 实体 第一个 上下文 mvvm | 更新日期: 2023-09-27 17:58:40
我对MVVM和WPF还很陌生,我不完全确定我现在要问的问题是否正确。
我正在制作一个MVVM WPF应用程序。我有一个SQL Server数据库,我首先使用Entity Framework数据库为我生成模型类。我已经创建了视图模型类,从今天阅读的几十篇教程中我了解到,我需要一个由我的视图模型类组成的ObservableCollection。这是正确的吗?
问题是,Entity Framework已经为我生成了一个数据库上下文,其中包含集合,但它们正在使用模型类,如果以上内容正确,那么我将需要使Entity Framework数据库上下文使用我的视图模型类。问题是怎么做。
我需要创建一个新的数据库上下文类来满足我的需求并使用它吗?或者我缺少一种更简单的方法吗?以下是实体框架为我生成的模型类:
public partial class Parent
{
public Parent()
{
this.Children = new HashSet<Child>();
}
public int ID { get; set; }
public string Name { get; set; }
public string PIN { get; set; }
public string Account { get; set; }
public string Identity_Card { get; set; }
public string Address { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
提前谢谢。告诉我,如果我错过了提到什么或添加代码的一部分,我会做的。
像这样的东西很可能足以满足@bas所提到的,我同意这是我们想要的方式。。您的视图模型不是您的模型。
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel(IRepository<Parent> parentRepo, IViewModelFactory factory)
{
// you might want to set this up as a fancy async method
// because.. it looks better and it's easier to read
Task.Factory
.StartNew(() => parentRepo.GetAll())
.ContinueWith(t =>
{
// Do error checking and all that boring stuff
ParentViewModels =
new ObservableCollection<ParentViewModel>(
t.Result.Select(p => factory.Create<ParentViewModel>(p)));
}, TaskScheduler.FromCurrentSynchronizationContext());
}
private ObservableCollection<ParentViewModel> _parentViewModels;
public ObservableCollection<ParentViewModel> ParentViewModels
{
get
{
return _parentViewModels;
}
set
{
_parentViewModels = value;
RaisePropertyChanged("ParentViewModels");
}
}
// INotifyPropertyChanged implementation goes here
}
// Super secret sauce viewmodelfactory and repository implementations go here
问题是实体框架已经生成了一个数据库上下文,其中包含集合,但它们正在使用模型类,如果以上是正确的,那么我需要实体框架数据库上下文使用我的视图模型类。这个问题是怎么做。
不确定我是否理解你在这里说的话,但生成的类就是生成的类。你不应该把它们变成别的东西。
生成的类可以由视图模型类读取。现在我可以想象这感觉像是重复,但还有更多需要考虑的。首先,数据库类可以包含比您希望在视图中显示的更多的数据。因此,隐藏数据,只为视图提供所需的数据是一种完美的策略。我认为在安全方面,可以肯定地说,在您看来,您不想提供直接连接到数据库的实体。但这可能是一个不同的讨论。
因此,创建视图模型并使用实体提供的数据填充它们。
在任何情况下,都不要修改生成的类,使其在再次生成时需要再次重做:)。
只需将当前DataContext中模型的引用替换为您要使用的模型的引用。