2010-07-10 31 views
6

Gần đây tôi đã bắt đầu sử dụng thư viện Chỉ mã EF v4 cho một số dự án tôi đang làm việc. Tuy nhiên, tôi đã chạy vào một chút của một snag. Tôi dường như không thể tìm ra định dạng phù hợp cho chuỗi kết nối. Tôi đã sử dụng đoạn mã sau để xây dựng các chuỗi kết nối:Entity Framework v4 Chuỗi kết nối chỉ mã

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

Tuy nhiên, sử dụng nó kết quả trong các lỗi sau:

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) 

Thấy như tôi không có bất kỳ siêu dữ liệu ... kể từ khi tôi đang sử dụng Code Only, tôi đang có một chút ràng buộc. Bất kỳ cái nhìn sâu sắc nào đều được đánh giá cao.

Chuỗi kết nối được tạo ra bởi các lớp học xây dựng như sau:

provider=System.Data.SqlClient;provider connection string="Data Source=localhost;Initial Catalog=ASM_Testing;Integrated Security=True;Pooling=False"


làm việc Ví dụ (dựa trên câu trả lời được chấp nhận)

Nó là cần thiết để sử dụng ContextBuilder để tạo ra bất kỳ ví dụ về ngữ cảnh sử dụng chế độ chỉ mã. Dưới đây là một ví dụ làm việc này cho những ai đang tìm kiếm một câu trả lời cho cùng một vấn đề:

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

Bạn có thể gửi chuỗi kết quả? Hay nó đã nổ tung khi thực thi mã này? –

+0

@Henk: Đã thêm chuỗi kết nối. – jrista

Trả lời

4

Để sử dụng nó:

var builder = new ContextBuilder<YourContext>(); 

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

Cảm ơn. Tôi biết về ContextBuilder, nhưng nó đã không vượt qua tâm trí của tôi để sử dụng nó trong các bài kiểm tra đơn vị của tôi cho lớp EntityContext của tôi. Tôi nghĩ rằng điều này sẽ giải quyết vấn đề mặc dù. Cảm ơn! – jrista

3

Theo như tôi hiểu cách sử dụng mã chỉ tiếp cận bạn không thể nhanh chóng bối cảnh bằng cách đơn giản thông qua chuỗi kết nối DB để nó ctor. Thông thường, bạn sẽ sử dụng ContextBuilder để tạo ngữ cảnh của mình.

  1. Xác định ctor tham EntityConnection trong EntityContext lớp

    công EntityContext (kết nối EntityConnection): cơ sở (kết nối) {}

  2. Tạo kết nối

    var nhà máy = DbProviderFactories.GetFactory ("System.Data.SqlClient"); var connection = factory.CreateConnection(); connection.ConnectionString = providerConnectionString;

  3. Sử dụng ContextBuilder để tạo ra bối cảnh mới

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

+0

+1 Câu trả lời hay. Tôi đọc cuốn sách đầu tiên của Gregoire, và đánh dấu nó là được chấp nhận. Cả hai người họ đều trả lời câu hỏi của tôi. Cảm ơn! – jrista

Các vấn đề liên quan