2010-07-10 88 views
6

我最近已开始将EF v4代码库用于我正在处理的一些项目。但是,我遇到了一些障碍。我似乎无法弄清楚连接字符串的正确格式。我用下面的代码来构建连接字符串:实体框架v4仅限代码连接字符串

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) 

看到,因为我没有任何元数据...因为我我正在使用Code Only,我有点困惑。任何见解都非常感谢。

由助洗剂类生成的连接字符串如下:

provider=System.Data.SqlClient;provider connection string="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); 
} 
+0

你能后生成的字符串?或者执行这段代码时它已经炸毁了吗? – 2010-07-10 08:20:08

+0

@亨克:添加了连接字符串。 – jrista 2010-07-10 08:26:24

回答

4

要使用它:

var builder = new ContextBuilder<YourContext>(); 

using (YourContext context = builder.Create(new SqlConnection(ConfigurationManager.ConnectionStrings["yourConenctionKeyInWebConfig"].ConnectionString))) 
{ 
    ... 
} 
+0

谢谢。我知道ContextBuilder,但它并没有跨越我的想法,在我的EntityContext类的单元测试中使用它。我认为这将解决问题。谢谢! – jrista 2010-07-11 00:51:50

3

据我了解使用代码唯一的方法,你不能简单地通过DB连接字符串来实例化上下文其构造函数。通常情况下,您会使用ContextBuilder来创建您的上下文。

  1. 定义构造函数在EntityContext类服用EntityConnection

    公共的EntityContext(EntityConnection连接):基座(连接) { }

  2. 创建连接

    变种工厂= DbProviderFactories.GetFactory ( “System.Data.SqlClient的”); var connection = factory.CreateConnection(); connection.ConnectionString = providerConnectionString;

  3. 使用ContextBuilder来创建新的上下文

    变种中,ContextBuilder =新中,ContextBuilder(); (...) var context = contextBuilder.Create(connection);

+0

+1很好的答案。我读了Gregoire的第一个,并将其标记为已接受。不过,他们都回答了我的问题。谢谢! – jrista 2010-07-11 00:53:16