Создание проекта доступа к данным с помощью Entity Framework

У меня есть автоматизированное тестовое решение, которое (допустим) содержит 3 проекта:

  1. DataAccessProject (который принимает данные из db и, таким образом, может называться производителем, и это мой StartUpFile)
  2. PageObjectStorage
  3. Сценарий и этапы проекта Я хочу сделать так, чтобы 1. проект использовал EF, не уведомляя другие проекты о том, что EF даже существует в решении. Я хочу (например), чтобы мой третий проект мог вызывать что-то вроде DataAccessProject.SomeMethod.GiveMeSomeUsers (), чтобы DataAccessProject брал записи из объекта, делал магию и просто возвращал информацию для сравнения со значениями из объекта страницы.

Я борюсь с: Сначала я получал эту ошибку:

No connection string named 'MyEntities' could be found in the application config file

Я прочитал некоторую статью о стеке и добавил узел строки подключения (я бы хотел избежать этого), и теперь я получаю эту ошибку:

Errors: TestModel.ssdl(2,2) : error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file.

Итак, мой вопрос: что я делаю не так? Как я могу установить EF, не добавляя ссылки на EF в каждом проекте (я считаю, что EF этого хочет от меня сейчас).

Связанные узлы .config:

<entityFramework>
  <defaultConnectionFactory         type = "System.Data.Entity.Infrastructure.LocalDbConnectionFactory,     EntityFramework">
    <parameters>
      <parameter value = "mssqllocaldb" />
    </parameters>
  </defaultConnectionFactory>
  <providers>
    <provider invariantName = "System.Data.SqlClient"     type = "System.Data.Entity.SqlServer.SqlProviderServices,     EntityFramework.SqlServer" />
  </providers>
</entityFramework>
<connectionStrings>
  <add name = "test1Entities"     connectionString = "metadata=res://*/TestModel.csdl|res://*/TestModel.ssdl|res://*/TestModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MSSQL-TEST;initial catalog=testCATALOG;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"         <providerName = "System.Data.EntityClient" />
</connectionStrings>

А пока я вызываю этот метод из трех своих проектов.

public static void TestMyEF()
{
    using (var ctx = new test1Entities())
    {
        var abc = ctx.someTable.FirstOrDefault();
    }
}

Контекстный ctor:

public test1Entities()
: base("name=test1Entities")
{
}

P.s. Я использовал первый подход к базе данных (создать .edxm из существующей базы данных), и я немного обеспокоен, потому что мой узел .config содержит <parameter value = "mssqllocaldb" />, БД не является локальной.

Передайте строку подключения непосредственно в конструктор, а не имя записи конфигурации. Это избавит вас от вашей первой ошибки. В любых проектах, где вы действительно используете контекст, вам нужно будет добавить ссылки на библиотеки EF.

Vidmantas Blazevicius 02.05.2018 11:20

Вы можете использовать предикаты (универсальных типов), чтобы выполнять свою работу по вызову функций, которые вы хотите выполнять в своей структуре сущностей, вместе с тем, что вам необходимо предоставить модели (структуру сущностей) вызывающему приложению.

vikscool 02.05.2018 11:24

@vikscool В том-то и дело, решение уже довольно большое и беспорядочное, поэтому я не хочу, чтобы какой-либо другой проект взаимодействовал с контекстом или объектами, я хочу, чтобы мой проект DA был максимально закрыт для другого проекта. Таким образом, представление модели другому проекту (обратите внимание, что они будут запрашивать возврат в собственных типах или пользовательских классах, а не в сущностях) кажется бессмысленным (я имею в виду, что EF будет бессмысленным, потому что это только создаст еще больше беспорядка в решении).

Vadim.K 02.05.2018 11:34

@VidmantasBlazevicius Что делать, если я не собираюсь использовать контекст напрямую, например project1 хочет, чтобы project2 сканировал контекст и возвращал некоторые строки, должен ли porject1 иметь ссылку на EF?

Vadim.K 02.05.2018 11:36

@ Vadim.K в этом случае можете ли вы использовать common library project для использования между двумя проектами, давайте просто предположим, что resultClass с объектом для результата и любым ответом, который вы хотите назначить этому объекту результата, а затем позволить другому проекту получить доступ только к общему классу результатов, а затем получить доступ к его значению.

vikscool 02.05.2018 11:39

Если вы создаете свой собственный уровень абстракции с помощью таких методов, как GetSomething(), вам не нужно будет ссылаться на библиотеки EF, но тогда вам нужно будет ссылаться на проект, в котором находятся эти уровни абстракции.

Vidmantas Blazevicius 02.05.2018 11:40

@vikscool, привет, я пытался передать строку подключения metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Mod‌​el1.msl;provider=Sys‌​tem.Data.SqlClient;p‌​rovider connection string=&quot;data source=MSSQL-TEST-QA;initial catalog=test1_ei_ei0;integrated security=True;MultipleActiveResultSets=True;App=EntityFramew‌​ork&quot; и получаю ошибку Keyword not supported: 'data source'..

Vadim.K 02.05.2018 12:30

@ Vadim.K, пожалуйста, обратитесь к этому ссылка на сайт

vikscool 02.05.2018 13:00

@vikscool yeap, я уже исправил эту проблему (просто совет из другого сообщения о замене и цитате кавычками вводил в заблуждение, пришлось заменить на \"), и мне даже удалось заставить это работать, к сожалению, для этого мне пришлось установить EF для вызова проектов, других недостатков я получаю ошибку - No Entity Framework provider found for the ADO.NET provider with invariant name

Vadim.K 02.05.2018 13:03

@vikscool невероятно тупой, но работает stackoverflow.com/a/19130718/6634405

Vadim.K 02.05.2018 13:21

@vikscool, можете ли вы опубликовать свой ответ как сообщение, чтобы я мог отметить вопрос как ответ?

Vadim.K 02.05.2018 13:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

public class MyResultClass
{
    public readonly object Value;
    public readonly Exception ResultException;
    //add more properties if needed

    public MyResultClass(object value)
    {
        this.ResultException = null;
        this.Value = value;
    }

    public MyResultClass(Exception ex)
    {
        this.ResultException = ex;
    }
}

затем используйте ссылку на этот класс в своих проектах, чтобы у вас не было зависимости от entity-framework, а затем вы можете использовать json (сериализация и десериализация) для преобразования данных из вашего DAP(DataAccessProject) в клиент (вызывающий проект).

Другие вопросы по теме