4

我对 MVVM 和 WPF 很陌生,我不完全确定我现在要问的内容是否正确。

我正在制作一个 MVVM WPF 应用程序。我有一个 SQL Server 数据库,我首先使用 Entity Framework 数据库为我生成模型类。我已经创建了视图模型类,从我今天阅读的几十个教程中了解到,我需要一个包含我的视图模型类的 ObservableCollection。那是对的吗?

问题是实体框架已经为我生成了一个包含集合的数据库上下文,但它们正在使用模型类,如果上面是正确的,那么我需要让实体框架数据库上下文使用我的视图模型类。问题是如何。

我是否需要创建一个适合我需要的新数据库上下文类并使用它来代替,或者是否有一种我缺少的更简单的方法?这是 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; }
}

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

4

3 回答 3

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
于 2013-02-11T00:40:25.770 回答
1

问题是实体框架已经为我生成了一个包含集合的数据库上下文,但它们正在使用模型类,如果上面是正确的,那么我需要让实体框架数据库上下文使用我的视图模型类。问题是如何。

不确定我是否理解您在此处所说的内容,但生成的类是生成的类。你不应该把它们塑造成别的东西。

您的视图模型类可以读取您生成的类。现在我可以想象这感觉像是重复,但还有更多需要考虑。首先,您的数据库类可以包含比您希望在视图中显示的更多的数据。因此,仅隐藏数据以便您仅向视图提供他们需要的数据是一个完美的策略。我认为在安全方面,在您看来,您不想提供直接连接到数据库的实体也是安全的。但这可能是一个不同的讨论。

因此,创建您的视图模型并用您的实体提供的数据填充它们。

在任何情况下,都不要修改生成的类,以至于在再次生成它们时需要再次重做:)。

于 2013-02-10T23:28:32.217 回答
0

只需将当前 DataContext 中模型的引用替换为您要使用的模型的引用即可。

于 2013-02-10T21:41:13.697 回答