Почему компилятор запрашивает ссылку на Entity Framework в проекте пользовательского интерфейса?

c# entity-framework-6 winforms

Вопрос

Я пытаюсь узнать, как создать приложение Winform C #, которое использует EF с шаблоном репозитория.

По моему мнению, слой пользовательского интерфейса должен быть независимым от Entity Framework (он использует данные через репозиторий, и ему все равно, есть ли инфраструктура Entity или какой-либо другой поставщик данных), но компилятор показывает и ошибку, если проект WinForms не имеет ссылки к инфраструктуре Entity (когда я добавляю ссылку на EF, все работает нормально)

Сообщение об ошибке

Поставщик службы Entity Framework не найден для поставщика ADO.NET с инвариантным именем «System.Data.SqlClient». Убедитесь, что провайдер зарегистрирован в разделе «entityFramework» файла конфигурации приложения

Почему компилятор нуждается в моем проекте Winform, чтобы иметь ссылку на инфраструктуру Entity?

Код проекта Winforms

    private void MainForm_Load(object sender, EventArgs e)
    {
        //Customer is a POCO class
        using (var customers = new EfRepository<Customer>())
        {
            foreach (var c in customers.All())
            {
                CList.Items.Add(c.CustomerName);
            }
        }
    }

    private void SaveCustomerButton_Click(object sender, EventArgs e)
    {
        var newCustomer=new Customer();
        newCustomer.CustomerName = CName.Text;
        newCustomer.CustomerDescription = CDescription.Text;
        //newCustomer.
        using (var customers = new EfRepository<Customer>())
        {
            customers.Add(newCustomer);
            customers.Commit();
        }
    }

Код из проекта репозитория

public class EfRepository<T> : IRepository<T>, IDisposable where T : class//, IEntity<int>
{
    private FirstContext _ctx = new FirstContext();
    private DbSet<T> _set;

    public EfRepository()
    {
        //_ctx = _context;
        _set = _ctx.Set<T>();
    }
    public void Add(T newEntity)
    {
        _set.Add(newEntity);
    }
    public IQueryable<T> All()
    {
        return _set;
    }

контекст

public class FirstContext : BaseContext<FirstContext>
{
    public DbSet<Customer> Customers{ get; set; }
}

[РЕДАКТИРОВАТЬ]

Я добавил app.config (к моему проекту UI) с информацией о моей базе данных, но он работает, только если я добавлю Entity Framework в свой проект пользовательского интерфейса, если я удалю EF из моего репозитория проектов пользовательского интерфейса, который подключается к базе данных, не возвращает никаких данных ( нет ошибки ...)

Вот содержание моего app.config:

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <connectionStrings>
    <add name="RepositoryDb" connectionString="Data Source=.;Initial Catalog=RepositoryDb;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

Принятый ответ

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

Но приложение по умолчанию использует только один файл конфигурации.
Поэтому вам нужны настройки db в app.config, как это говорит вам ошибка.

Когда вы добавили EF-библиотеки, вероятно, было несколько изменений в файле конфигурации. Возможно, он будет продолжать работать, когда вы снова удалите библиотеки.


Популярные ответы

После размещения файла конфигурации в главном приложении это было решением моей проблемы

 public PSContext() : base() 
        {

            var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
        }

Больше ошибок ...



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему