2013-02-10 66 views
4

我是MVVM和WPF的新手,我不完全確定我現在要問的是否正確。使用實體框架數據庫第一個數據庫上下文與mvvm視圖模型類

我正在製作一個MVVM WPF應用程序。我有一個SQL Server數據庫,我首先使用實體​​框架數據庫爲我生成模型類。我創建了視圖模型類,從我從今天閱讀的幾十個教程中瞭解到,我需要一個由我的視圖模型類組成的ObservableCollection。那是對的嗎?

的問題是,實體框架已經產生了數據庫上下文對我來說它包含集合,但他們使用的模型類,如果上面是正確的,那麼我就需要使實體框架數據庫上下文中使用我的視圖模型類。問題是如何。

我是否需要創建一個新的數據庫上下文類,它適合我的需求並使用它,或者是否存在我失蹤的更簡單的方法? 這裏是實體框架爲我所生成的模型類:

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

loooooooot要讀取的文本。段落有助於可讀性:) – bas 2013-02-10 21:34:39

+0

我編輯了一下。希望現在更具可讀性:) – Phoenix 2013-02-10 22:29:19

+0

嗯,不知道如果我跟着,但你只需要每個數據庫方案,一個數據庫環境。你有這個,但你想與你分享這些數據查看模型?是嗎?如果是這樣,什麼讓你遠離它。通過它的聲音,你是在正確的軌道 – bas 2013-02-10 22:34:27

回答

3

這樣的事情很可能就足夠了@bas提到的, ,我同意這是所需的方式去..你的viewmodels不是 您的模型。

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 
+0

謝謝!太棒了!那是我錯過的。視圖模型特定於視圖而不是模型類。我想我終於開始明白MVVM是如何被設計使用的。再次感謝您:-) – Phoenix 2013-02-11 00:56:47

+0

很高興我能幫助您,MVVM冒險中的好運 – 2013-02-11 01:02:46

0

只需將當前DataContext中的模型的引用替換爲您要使用的模型的引用即可。

+0

是的。我想過辦法,但問題是,當我從數據庫中重新生成模型類,例如,當我添加一個新的列或表我必須說一遍又一遍做。這不是什麼大問題。我只是覺得可能有更好的辦法。 :) – Phoenix 2013-02-10 22:33:15

+0

然後使用生成的模型對數據庫的訪問,然後創建映射功能,可以將EF模型轉換到視圖模型,反之亦然。您可以使用像[AutoMapper](http://nuget.org/packages/AutoMapper/2.2.0)這樣的庫來提供幫助。 – 2013-02-10 23:07:43

+0

謝謝。我會試試:)另外一件事:有沒有更好的方法可以將MVVM模式與實體框架數據庫優先使用?我錯過了什麼嗎?我只是有這種感覺的時候有做一些更好的辦法......我可能是錯的,但我只是想確認;) – Phoenix 2013-02-10 23:19:51

1

的問題是,實體框架已經產生了一個數據庫 方面對我來說它包含集合,但他們使用的模型 類,如果上面是正確的,那麼我就需要使 實體框架數據庫上下文使用我的視圖模型類。 的問題是如何。

不知道我是否明白你在說什麼,但生成的類是生成的類。你不應該把它們塑造成別的東西。

您的視圖模型類可以讀取您生成的類。現在我可以想象這就像重複,但還有更多要考慮。首先,您的數據庫類可以包含比您希望在視圖中顯示的數據更多的數據。因此,只需隱藏數據,以便只提供您的意見,他們需要的數據是一個完美的戰略。我認爲從安全角度來看,在您看來,您不想提供直接連接到數據庫的實體也是安全的。但這可能是一個不同的討論。

因此,創建視圖模型,並通過您的實體提供的數據填充它們。

在任何情況下,不要修改好需要的,當你再次生成它們重做一遍:)這樣您產生類。

+0

是的。這感覺更像我認爲應該的方式。您能否提供一些示例代碼來說明我需要如何訪問數據庫中的數據,因爲我不太清楚應該如何實現。我知道如何通過使用上下文來訪問數據,但如果我的viewmodel沒有任何連接,我不知道該怎麼做。我仍然試圖圍繞這個整個MVVM的概念,我很感謝任何人幫助我:-) – Phoenix 2013-02-10 23:38:48

相關問題