2013-10-11 95 views
0

這讓我很生氣。我對WPF/EF相當陌生。WPF中的MVVM與實體框架未處理的異常

我有一個簡單的MVVM應用程序,它通過XAML中的綁定將實體表讀入DataGrid。該應用程序編譯好。

不過,我得到這個未處理的異常,其鎖定設計師

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid. 
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString) 
at System.Data.EntityClient.EntityConnection..ctor(String connectionString) 
at System.Data.Objects.ObjectContext.CreateEntityConnection(String connectionString) 

的XAML無法創建我的視圖模型的實例...

xmlns:vm="clr-namespace:Entity_MVVM" 
    Title="MainWindow" Height="600" Width="800" 
    DataContext="{DynamicResource MyViewModel}"> 
<Window.Resources> 
    <vm:CountrysViewModel x:Key="MyViewModel"/> 
</Window.Resources> 

這裏是我的視圖模型「加載Grid'方法:

public void LoadGrid() 

    { 
     var db = new LDBEntities(); 
     using (var conn = new EntityConnection("name=LDBEntities")) 
     { 
      conn.Open(); 
      EntityCommand cmd = conn.CreateCommand(); 
      cmd.CommandText = "SELECT VALUE c FROM LDBEntities.tbCountrys as c"; 

      try 
      { 
       EntityDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection); 

       _CountrysModelObservableList.Clear(); 

       while (rdr.Read()) 
       { 
        var cCountryId = rdr["CountryId"].ToString(); 
        var cShortName = rdr["shortName"].ToString(); 
        var cLongName = rdr["longName"].ToString(); 

        _CountrysModelView = new CountrysModel() 
        { 
         CountryId = cCountryId, 
         ShortName = cShortName, 
         LongName = cLongName 
        }; 

        _CountrysModelObservableList.Add(_CountrysModelView); 
       } 
      } 
      catch(Exception e) 
      { 
       MessageBox.Show(string.Format("Can't read in data!")); 
      } 
     } 

我的App.config中的連接字符串是在cre上創建的我的EF模型並根據預期填充DataGrid。

任何想法是什麼造成這種情況?

週五下午無奈!由於

編輯:App.Config中:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<connectionStrings> 
<add name="LDBEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string='Data Source=DMEA-T1000\SQLEXPRESS;Initial Catalog=LDB;Persist Security Info=True;User ID=sa;Password=PasswordHidden;MultipleActiveResultSets=True' " providerName="System.Data.EntityClient" /></connectionStrings> 
</configuration> 
+0

什麼版本的EF? 4? – Charleh

+0

嗨,是的EF4,感謝 – Hardgraf

+3

國際海事組織,使用像這樣的實體框架(就像它是與所有這些魔術字符的東西和手動映射普通舊ADO.Net)完全失敗了ORM的目的。 –

回答

1

當您ERM添加到項目它會爲你創建模型。

如果你在你的數據庫的表中調用例如tblYears你應該能夠聲明:

tblYear y = new tblYear(); 

我個人創建本地模型,並填充它的觀點,即視圖模型使用。

class YearModel : INotifyPropertyChanged 
{ 

#region Members 

    MyERM.tblYear _year; 

#endregion 

#region Properties 

    public MyERM.tblYear Year 
    { 
     get { return _year; } 
    } 

    public Int32 id 
    { 
     get { return Year.id; } 
     set 
     { 
      Year.id = value; 
      NotifyPropertyChanged("id"); 
     } 
    } 

    public String Description 
    { 
     get { return Year.Description; } 
     set 
     { 
      Year.Description = value; 
      NotifyPropertyChanged("Description"); 
     } 
    } 

#endregion 

#region Construction 

    public YearModel() 
    { 
     this._year = new MyERM.Year 
     { 
      id = 0, 
      Description = "" 
     }; 
    } 

#endregion 
} 

然後,您可以使用此視圖模型要麼填充列表<>或作爲一個單獨的記錄 - 列表例如:

class YearListModel 
{ 
    myERM db = new myERM(); 

    #region Members 

    private ObservableCollection<YearModel> _years; 

    #endregion 

    #region Properties 

    public ObservableCollection<YearModel> Years 
    { 
     get { return _years; } 
    } 

    #endregion 

    #region Construction 

    public YearListModel() 
    { 
     _years = new ObservableCollection<YearModel>(); 

     foreach (MyERM.tblYear y in db.tblYears()) 
     { 
      _years.Add(new YearModel 
      { 
       id = y.id, 
       Description = y.Description 
      } 
     ); 
     } 
    } 

    #endregion 
} 

再比如說,你可以把它送到一個頁面,如下所示:

xmlns:local="clr-namespace:MyProject.ViewModels" 

<Page.Resources> 
    <local:YearListModel x:Key="YearList" /> 
</Page.Resources> 

並將其綁定到一個控制:

<ListView x:Name="listviewname" 
      DataContext="{StaticResource ResourceKey=YearList}" 
      ItemsSource="{Binding Path=Years}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn x:Name="columnname" Header="Code" 
          DisplayMemberBinding="{Binding Code}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

希望這有助於GL

+0

太好了,謝謝你的幫助!只有1年的編程/ C#經驗,這大大簡化了事情。 – Hardgraf

+0

我似乎無法爲MyERM.TableName創建一個對象(在我的情況下爲LDBEntities.tbCountrys) – Hardgraf

+0

如果您在添加erm實例後將其添加到數據庫,則需要刷新erm。如果刷新不起作用(buggy),請複製名稱,刪除它並使用相同的名稱重新添加它。然後數據庫中的任何更新都會反映在erm中。我必須多次這樣做,這是習慣習慣。更改數據庫 - 重新附加edm(如果刷新不起作用)。 –