4

Извините, если об этом уже ответили, но после 2 часов исследований я еще не нашел окончательного ответа на этот вопрос. Надеюсь, просят дать результаты.Удаление ссылки на Entity Framework из проекта MVC

Я «несколько лучше новичка» с MVC и EF, но я понимаю общую архитектуру приложения. Понимаете, для еще большего разделения проблем и будущих плановых изменений я хотел бы отложить мой проект MVC от Entity Framework. Вот то, что я до сих пор:

  • Models проекта (полный хорошо аннотированный Pocos, как контейнеры, нет бизнес-логики)
  • DataAccess проекта (ссылки мой проект модели, и Entity Framework)
  • MVC Web проект (который ссылается только на мой проект модели)

Я уже создал свой шаблон хранилища (в проекте DataAccess) и протестировал его с помощью отдельного проекта UnitTest. Все работает.

Проблема заключается в том, что потребитель (проект UnitTest, в данном случае) по-прежнему нуждается в nuget с ссылкой на Entity Framework (то же, что и с веб-проектом MVC). Когда я удалить ссылку EF из моего тестового проекта (и вместо того, чтобы прописывать мое соединение строка при переходе его в мой DATAACCESS проект), я получаю эту ошибку:

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.

Как я могу спроектировать это, так что я могу полностью удалить ссылку Entity Framework от потребителя репозитория (веб-проекты UnitTest или MVC)? Я хочу делать все через свой репозиторий, без проекта MVC, зная что-нибудь о моей технологии ORM.

ответ

3

Это немного ошибочно. Во-первых, причина, по которой требуется ссылка на Entity Framework, заключается в том, что вы пропускаете код из этой библиотеки в свой проект MVC. Единственный способ избежать ссылки - это 100% отделить код. Это потенциально возможно, но не просто на любом участке. Однако это не важно. Ссылка на Entity Framework не имеет смысла. Важная часть конструкции N-уровня - это разделение различных функций , не обязательно ссылок. Если ваш DAL зависит от EF, и ваш MVC-проект зависит от вашего DAL, тогда у вас есть неотъемлемая зависимость от EF в любом случае.

+0

Интересно. Так вы могли бы расширить дальше. Как я мог полностью избежать ссылки? И когда я готов выйти из EF и использовать другую ORM, это единственный раз, когда я смогу удалить ссылку EF из проекта MVC? –

0

Даже после удаления пакета NuGet у вас могут быть остаточные реквизиты в ваших конфигурациях (пакеты и/или веб-сайты), связанные с EF. Также стоит проверить файл csproj. Проблема, с которой вы сталкиваетесь, - отсутствие такой строки в вашем конфиге.

<entityFramework> 
    ...  
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
</entityFramework> 

Это, как говорится, все еще показывает, что ваш проект фактически связан с EF afaik.

+0

Вот чего я пытаюсь избежать. –

0

Вы можете попробовать получить доступ к вашим услугам через веб-API, который действует как буфер для уровня доступа к данным и занимается просмотром моделей, передаваемых взад и вперед как анонимные объекты JSON. Затем ваш интерфейс (веб-сайт) может быть полностью изолирован от деталей API и просто действовать как клиент для него. Угловые JS/Angular (2) хорошо подходят для этого подхода, так как я уверен, что многие другие технологии на стороне клиента делают это.

+0

Правда, правда. Однако, но потом мы теряем сильную типизацию и ремонтопригодность. –

+0

Да, но в наши дни есть способы обойти это, например, с помощью TypeScript с автоматически обновляемыми файлами объявления, чтобы закрыть цикл. –

1

Проблема заключается в том, что Visual Studio удаляет все ссылки, которые не используются в проекте. Это решило проблему для меня:

public DbContext() 
    :base() 
{ 
    var a = System.Data.Entity.SqlServer.SqlProviderServices.Instance; 
}