Entity Framework v4 Строка подключения только для кода

Недавно я начал использовать библиотеку EF v4 Code Only для некоторых проектов, над которыми я работаю. Тем не менее, я столкнулся с небольшой загвоздкой. Кажется, я не могу понять правильный формат строки подключения. Я использовал следующий код для создания строки подключения:

string connectionString = new EntityConnectionStringBuilder
{
    Provider = "System.Data.SqlClient",
    ProviderConnectionString = new SqlConnectionStringBuilder
    {
        DataSource = "localhost",
        InitialCatalog = "ASM_Testing",
        IntegratedSecurity = true,
        Pooling = false
    }.ConnectionString
}.ConnectionString;

Однако его использование приводит к следующей ошибке:

Specifications_for_EntityContext.When_logging_in_application_with_valid_app_role_and_password.Login_should_be_successful : System.ArgumentException : Some required information is missing from the connection string. The 'metadata' keyword is always required.
Stack Trace:
   at System.Data.EntityClient.EntityConnection.ValidateValueForTheKeyword(DbConnectionOptions effectiveConnectionOptions, String keywordName)
   at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
   at System.Data.Objects.ObjectContext..ctor(String connectionString)
   at ASM.Data.EntityContext..ctor(String connectionString) in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\ASM.Data\EntityContext.cs:line 16
   at Specifications_for_EntityContext.Behaves_like_EntityContext_connected_to_a_database.TestableEntityContext..ctor(String connectionString) in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\Tests.ASM.Data\EntityContextFacts.cs:line 165
   at Specifications_for_EntityContext.Behaves_like_EntityContext_connected_to_a_database.InitializeContext() in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\Tests.ASM.Data\EntityContextFacts.cs`e`enter code here`nter code here`:line 160
   at ASM.Testing.xUnit.ObservationCommand.Execute(Object testClass) in C:\Users\Jon Rista\TFS\Advanced Service Management\Trunk\Main\Source\ASM.Testing.xUnit\ObservationCommand.cs:line 24
   at Xunit.Sdk.FixtureCommand.Execute(Object testClass)
   at Xunit.Sdk.BeforeAfterCommand.Execute(Object testClass)
   at Xunit.Sdk.LifetimeCommand.Execute(Object testClass)
   at Xunit.Sdk.TimedCommand.Execute(Object testClass)
   at Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute(Object testClass)

Поскольку у меня нет никаких метаданных... поскольку я использую только код, я немного запутался. Любое понимание очень ценится.

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

provider=System.Data.SqlClient;строка подключения провайдера="Data Source=localhost;Initial Catalog=ASM_Testing;Integrated Security=True;Pooling=False"


Рабочий пример (на основе принятых ответов)

Необходимо использовать ContextBuilder для создания любого экземпляра контекста, использующего режим только для кода. Вот рабочий пример этого для тех, кто ищет ответ на ту же проблему:

protected override void InitializeContext()
{
    string connectionString = new SqlConnectionStringBuilder
    {
        DataSource = "localhost",
        InitialCatalog = "Testing",
        IntegratedSecurity = true,
        Pooling = false
    }.ConnectionString;

    var connection = new SqlConnection(connectionString);
    var builder = new ContextBuilder<TestableEntityContext>();
    m_context = builder.Create(connection);
}

person jrista    schedule 10.07.2010    source источник
comment
Можете ли вы опубликовать полученную строку? Или он уже взрывается при выполнении этого кода?   -  person Henk Holterman    schedule 10.07.2010
comment
@Henk: добавлена ​​строка подключения.   -  person jrista    schedule 10.07.2010


Ответы (2)


Чтобы использовать его:

var builder = new ContextBuilder<YourContext>();

using (YourContext context = builder.Create(new SqlConnection(ConfigurationManager.ConnectionStrings["yourConenctionKeyInWebConfig"].ConnectionString)))
{
     ...
}
person Gregoire    schedule 10.07.2010
comment
Спасибо. Я знал о ContextBuilder, но мне не приходило в голову использовать его в модульных тестах для моего класса EntityContext. Я думаю, что это решит проблему, хотя. Спасибо! - person jrista; 11.07.2010

Насколько я понимаю, используя подход только с кодом, вы не можете создать экземпляр контекста, просто передав строку подключения к БД своему ctor. Обычно вы бы использовали ContextBuilder для создания своего контекста.

  1. Определить ctor, принимающий EntityConnection в EntityContext классе

    public EntityContext (соединение EntityConnection): база (соединение) {}

  2. Создать соединение

    var factory = DbProviderFactory.GetFactory("System.Data.SqlClient"); соединение var = factory.CreateConnection(); Connection.ConnectionString = провайдерConnectionString;

  3. Используйте ContextBuilder для создания нового контекста

    var contextBuilder = новый ContextBuilder(); contextBuilder.Configurations.Add(...) var context = contextBuilder.Create(connection);

person Yury Tarabanko    schedule 10.07.2010
comment
+1 Отличный ответ. Сначала я прочитал Грегуара и отметил его как принятый. Хотя оба они ответили на мой вопрос. Спасибо! - person jrista; 11.07.2010