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

时间:2013-02-10 21:33:17

标签: c# wpf mvvm model viewmodel

我是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; }
}

提前致谢。告诉我,如果我错过了提及或添加部分代码,我会这样做。

3 个答案:

答案 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中模型的引用替换为您要使用的模型的引用。