4

私は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; }
}

前もって感謝します。何か言い忘れていたり、コードの一部を追加したりしていないか教えてください。

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

問題は、Entity Framework がコレクションを含むデータベース コンテキストを既に生成しているが、モデル クラスを使用していることです。上記が正しければ、Entity Framework データベース コンテキストでビュー モデル クラスを使用する必要があります。問題は方法です。

ここで何を言っているのかわかりませんが、生成されたクラスは生成されたクラスです。それらを別のものに成形することは想定されていません。

生成されたクラスは、ビュー モデル クラスで読み取ることができます。重複しているように感じることは想像できますが、考慮すべき点は他にもあります。まず、データベース クラスには、ビューに表示するよりも多くのデータを含めることができます。したがって、ビューが必要とするデータのみをビューに提供するようにデータを非表示にすることは、完璧な戦略です。あなたの見解では、データベースに直接接続されているエンティティを提供したくないと言っても安全だと思います。しかし、それはおそらく別の議論です。

したがって、ビュー モデルを作成し、エンティティを介して提供されるデータを入力します。

いずれにせよ、生成されたクラスを再度生成するときにやり直す必要があるような方法で変更しないでください:)。

于 2013-02-10T23:28:32.217 に答える
0

現在の DataContext 内のモデルの参照を、使用したいモデルの参照に置き換えるだけです。

于 2013-02-10T21:41:13.697 に答える