Entity framework 6 без файла конфигурации?

У меня есть приложение, которое не может использовать файл конфигурации и должно настроить строку соединения для контекста сущности по коду (с EntityConnectionStringBuilder).

Проблема заключается, однако, в следующем: "Поставщик службы Entity Framework не найден для поставщика ADO.NET с инвариантным именем" System.Data.SqlClient ".

Так как я не могу использовать стандартный файл app.config, я ввернусь в EF6? Это не проблема в EF4, если я правильно помню. Поэтому настройки внутри тега entityFramework - это то, что я хочу установить в коде.

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>

Ответ 1

Я использую EF 6 без файла App.config, я просто передаю строку подключения в свой DBContext (ну, соединение считывается из файла конфигурации в другом месте, но это зависит от вас). Просто удалите все файлы EF из конфигурационного файла.

Вот как я заработал.

public partial class MyDbContext : DbContext, IMyDbContext
{
    public MyDbContext(string connectionString,
                                         DbValidationMode validationMode = DbValidationMode.Enabled,
                                         DbLazyLoadingMode lazyLoadingMode = DbLazyLoadingMode.Disabled,
                                         DbAutoDetectMode autoDetectMode = DbAutoDetectMode.Enabled)
            : base(((EntityConnectionStringBuilder)new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                ProviderConnectionString = connectionString,
                Metadata = @"res://*/Contexts.Test.MyModel.csdl|res://*/Contexts.Test.MyModel.ssdl|res://*/Contexts.Test.MyModel.msl"
            }).ToString())
            { 
                    this.Configuration.ValidateOnSaveEnabled = validationMode.Equals(DbValidationMode.Enabled);
                    this.Configuration.LazyLoadingEnabled = lazyLoadingMode.Equals(DbLazyLoadingMode.Enabled);
                    this.Configuration.AutoDetectChangesEnabled = autoDetectMode.Equals(DbAutoDetectMode.Enabled);
            }
... Etc  

Затем я просто вставляю этот контекст во все мои сервисы.

Я использую проект Database First, поэтому мне стало легче изменять шаблоны T4.

Там могут быть более приятные способы сделать это, но я вообще не сталкивался с какими-либо проблемами.