0

This is driving me mad. I'm fairly new to WPF/EF.

I have a simple MVVM app which reads an Entity Table into a DataGrid via binding in the XAML. The app compiles fine.

I am getting this unhandled exception however which locks the designer:

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)

The XAML cannot create an instance of my View Model...

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

Here is my View Model 'Load Grid' method:

 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!"));
            }
        }

The connection string in my App.config was created on creation of my EF model and populates the DataGrid as intended.

Any ideas what is causing this?

Friday afternoon frustration! Thanks

Edit: 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>
4

1 回答 1

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
}

然后,您可以使用此视图模型来填充 List<> 或作为单独的记录 - 列表示例:

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

于 2013-10-11T21:10:37.067 回答