将实体框架数据库第一个数据库上下文与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; }
}

提前谢谢。告诉我,如果我错过了提到什么或添加代码的一部分,我会做的。

将实体框架数据库第一个数据库上下文与mvvm视图模型类一起使用

像这样的东西很可能足以满足@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中模型的引用替换为您要使用的模型的引用。