Создать DataContext из строки подключения Entity Framework? - PullRequest
6 голосов
/ 16 мая 2011

Я пытаюсь сделать этот вызов в своем коде:

string conn = ConfigurationManager.ConnectionStrings["MyDBEntities"].ConnectionString;
DataContext context = new DataContext(conn);
Table<MyApp.Entities.Employee> myTable = context.GetTable<MyApp.Entities.Employee>();

Вот мои строки подключения:

<connectionStrings>
  <add name="MyDBEntities" connectionString="metadata=res://*/Entities.MyDB.csdl|res://*/Entities.MyDB.ssdl|res://*/Entities.MyDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=STEVEN-PC;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  <add name="MyDB" connectionString="Server=STEVEN-PC;Database=MyDB;Trusted_Connection=yes;" />
</connectionStrings>

При создании DataContext возникает ошибка: Ключевое слово не поддерживается: 'метаданные'.

Если я использую вторую строку подключения, я получаю сообщение об ошибке при попытке получить таблицу: Ошибка сервера в приложении '/'.Тип 'MyApp.Entities.Employee' не отображается как таблица.

Что я здесь не так делаю?

Ответы [ 4 ]

9 голосов
/ 16 мая 2011

Вы смешиваете и сопоставляете LINQ-to-SQL и LINQ-to-Entites ;они несовместимы.

Когда вы создаете модели сущностей с LINQ-to-Entities, он создает объект, полученный из ObjectContext, который будет иметь IQueryable<T> реализации, которые вы бы использовали для базы вашего запроса.Этот ObjectContext также будет иметь конструкторы, которые принимают соответствующие метаданные для отображения моделей сущностей в базу данных;Вот почему строки подключения Entity Framework требуют Metadata ссылок.

Когда вы пытаетесь использовать LINQ-to-SQL, вы можете передать ему обычное соединение с базой данных классу DataContext(или производный класс).DataContext обрабатывает сопоставление ваших объектов с базой данных иначе, чем Entity Framework;он опирается на атрибуты моделей для сопоставления с таблицами / столбцами (используя атрибуты TableAttribute и ColumnAttribute соответственно).Эти атрибуты отсутствуют при создании сущностей с использованием Entity Framework.

Примечание. Вы можете использовать файлы сопоставления XML (другой вид, чем тот, который используется в Entity Framework) с LINQ-to-SQL, но этообычно не используется.

При этом проще всего было бы выбрать один технологический стек (LINQ-to-SQL или LINQ-to-Entities) и придерживаться его.

5 голосов
/ 31 мая 2013

На всякий случай, это то, что я сделал.У меня нет соединений в Web.config, так как мне нужен DropDownList для выбора соединения.

string connDev = @"metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=""Server=MyDevServer;Database=MyDB;Integrated Security=True""";

EntityConnection ec = new EntityConnection(connDev);

MyDBContext db = new MyDBContext(ec);

var people = db.People.ToList();
5 голосов
/ 16 мая 2011

Если вы хотите использовать Entity Framework, вам следует использовать ObjectContext, а не DataContext, поскольку это базовый класс из Linq-To-Sql.

При создании модели данных ADO.NET Entity, Visual Studio создает (после завершения создания модели из мастера базы данных или использования конструктора) класс, производный от ObjectContext, который имеет строку подключения по умолчанию (которую вы выбираете в мастере). Здесь вы можете увидеть хороший урок от команды ADO.NET, как начать использовать EF.

Вы не должны использовать ObjectContext напрямую, по крайней мере, без создания файлов метаданных вручную и указания на них в строке подключения (Никогда не видел, чтобы класс DataContext использовался напрямую, поэтому, если я ошибаюсь, кто-то исправит меня), как мастер, о котором я упоминал выше, создает все виды данных отображения - для сопоставления таблиц / представлений SQL / других элементов с классами Entity.

, если вы хотите предоставить собственное соединение с классом, вы можете сделать это программнос EntityConnectionStringBuilder .

Этот является примером того, как использовать EntityConnectionStringBuilder из MSDN

Редактировать: я по ошибке написал о DataContext, как будто это EFбазовый класс для созданного дизайнером кода. casperOne объявил базовый класс для классов Linq-Sql.

Изменен мой ответ, чтобы отразить его комментарий

1 голос
/ 16 мая 2011

Строка соединения уже определена в EntityModel, поэтому вы можете попробовать использовать соединение по умолчанию следующим образом:

using (context = new DataContext())
{
    var myTable = context.GetTable<MyApp.Entities.Employee>();
}

Вы также можете попробовать следующее:

MyApp.Entities.Employee myTable = context.GetTable<MyApp.Entities.Employee>();

EDIT: GetTable () вернет тип T, поэтому приведенный выше синтаксис будет правильным.

Если вы хотите переопределить строку подключения, используйте вторую строку подключения из файла web.config (MyDB)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...