我是MVVM和WPF的新手,我不完全确定我现在要问的是否正确。
我正在制作一个MVVM WPF应用程序。我有一个SQL Server数据库,我使用Entity Framework数据库优先为我生成模型类。我已经创建了视图模型类,根据我从今天阅读的几十个教程中的理解,我需要一个ObservableCollection,它包含我的视图模型类。这是对的吗?
问题是Entity Framework已经为我生成了一个包含集合的数据库上下文,但是他们正在使用模型类,如果上面是正确的,那么我将需要使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; }
}
提前致谢。告诉我,如果我错过了提及或添加部分代码,我会这样做。
答案 0 :(得分:3)
这样的东西很可能足以满足@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
答案 1 :(得分:1)
问题是Entity Framework已经生成了一个数据库 我的上下文包含集合,但他们正在使用模型 如果以上是正确的,那么我将需要制作 实体框架数据库上下文使用我的视图模型类。该 问题是如何。
不确定我是否理解你在这里所说的内容,但生成的类是生成的类。你不应该把它们塑造成别的东西。
您的视图模型类可以读取您生成的类。现在我可以想象这就像复制一样,但还有更多要考虑的问题。首先,您的数据库类可以包含比您希望在视图中显示的数据更多的数据。因此,只是隐藏数据以便您只提供他们所需的数据,这是一个完美的策略。我认为安全方面,您可以放心地说,您不希望在您的视图中提供与您的数据库直接相关的实体。但这可能是一个不同的讨论。
因此,创建视图模型并使用您实体提供的数据填充它们。
在任何情况下,请勿修改生成的类,以便在再次生成它们时再次重做它:)。
答案 2 :(得分:0)
只需将当前DataContext中模型的引用替换为您要使用的模型的引用。