Я недавно начал пользоваться библиотекой 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. Данные. SqlClient; строка подключения поставщика = "Данные Source=localhost; Начальный Catalog=ASM_Testing; Интегрированный 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);
}
Для использования:
var builder = new ContextBuilder<YourContext>();
using (YourContext context = builder.Create(new SqlConnection(ConfigurationManager.ConnectionStrings["yourConenctionKeyInWebConfig"].ConnectionString)))
{
...
}
Насколько я понимаю, используя подход code only, вы не можете инстанцировать контекст, просто передав строку подключения к DB его ctor. Обычно для создания контекста используется ContextBuilder
.
Определяем ctor, принимающий EntityConnection
в EntityContext
class
public EntityContext(EntityConnection connection): base(connection) { }
Создаем соединение
var factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); var connection = factory.CreateConnection(); connection.ConnectionString = providerConnectionString;
Используйте ContextBuilder
для создания нового контекста
var contextBuilder = new ContextBuilder(); contextBuilder.Configurations.Add(...) var context = contextBuilder.Create(connection);