Entity Framework v4 строка подключения только для кода - PullRequest
6 голосов
/ 10 июля 2010

Я недавно начал использовать библиотеку 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; строка подключения поставщика = "Источник данных = localhost; Начальный каталог = ASM_Testing; Интегрированная безопасность = True; Объединение = 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);
}

Ответы [ 2 ]

4 голосов
/ 11 июля 2010

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

var builder = new ContextBuilder<YourContext>();

using (YourContext context = builder.Create(new SqlConnection(ConfigurationManager.ConnectionStrings["yourConenctionKeyInWebConfig"].ConnectionString)))
{
     ...
}
3 голосов
/ 11 июля 2010

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

  1. Определение взятия ctor EntityConnection в EntityContext class

    public EntityContext (соединение EntityConnection): base (соединение) {}

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

    var factory = DbProviderFactories.GetFactory ("System.Data.SqlClient");var connection = factory.CreateConnection ();connection.ConnectionString = providerConnectionString;

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

    var contextBuilder = new ContextBuilder ();contextBuilder.Configurations.Add (...) var context = contextBuilder.Create (connection);

...