2014-06-16 22 views
11

Tôi đang sử dụng EF6 trong một thư viện lớp (cơ sở dữ liệu đầu tiên)Đi qua kết nối String để Entity Framework 6

Khi tôi đi theo trình hướng dẫn và bổ sung bảng của tôi, tôi chọn không phải để lưu trữ các chuỗi kết nối trong app.config và rằng Tôi sẽ gửi chuỗi kết nối.

Tôi chưa từng làm điều này trước đây. Thông thường tôi chọn để đặt chuỗi kết nối trong tệp app.config.

Tôi bây giờ hoàn toàn bối rối như thế nào tôi thực sự gọi một chức năng và vượt qua chuỗi kết nối với nó.

Dưới đây là những gì tôi hy vọng là các đoạn mã có liên quan từ giải pháp của tôi.

Trong app.config - EF tự động thêm vào này:

<connectionStrings> 
<add name="cerviondemoEntities" connectionString="metadata=res://*/DatabaseModel.cervionEDM.csdl|res://*/DatabaseModel.cervionEDM.ssdl|res://*/DatabaseModel.cervionEDM.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DEVBOX;initial catalog=cerviondemo;user id=sa;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

tự động tạo lớp bối cảnh của tôi trông như thế này:

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated from a template. 
// 
//  Manual changes to this file may cause unexpected behavior in your application. 
//  Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace CervionFunctions.DatabaseModel 
{ 
using System; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 

public partial class cerviondemoEntities : DbContext 
{ 
    public cerviondemoEntities() 
     : base("name=cerviondemoEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<Customer> Customers { get; set; } 
    public virtual DbSet<Ticket> Tickets { get; set; } 
} 
} 

Cuối cùng, tôi đang cố gắng để gọi hàm kiểm tra sau đây:

public static List<Customer> customersToUpdate() 
    { 
     cerviondemoEntities db; 

     using (db = new DatabaseModel.cerviondemoEntities()) 
     { 
      var result = from customers in db.Customers 
         select customers; 

      return result.ToList(); 
     } 
    } 

Tôi không thể tìm cách gửi chuỗi kết nối đến chức năng đó :(

Mọi trợ giúp sẽ được đánh giá cao!

Trả lời

28

Theo quy ước, Entity Framework lấy chuỗi kết nối có tên giống như bối cảnh. Ví dụ:

public cerviondemoEntities() 
    : base("name=cerviondemoEntities") 
{ 
} 

Lớp DbContext có một hàm tạo chuỗi kết nối. Bạn có thể thêm một hàm tạo khác có một chuỗi kết nối làm tham số và chuyển nó tới hàm tạo cơ sở.

public cerviondemoEntities(string connectionString) : base(connectionString) 
{ 
} 

Hãy chắc chắn tạo một lớp học để hàm tạo thêm của bạn không bị ghi đè.

mẫu ConnectionString:

<connectionStrings> 
    <add name="cerviondemoEntities" connectionString="data source=server\database;initial catalog=catalog;persist security info=True;user id=user;password=password;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> 
</connectionStrings> 
+3

Ngoài ra, bạn có thể thêm nó vào tập tin .tt thay vì tạo một tập tin và sử dụng 'một phần' – Daniel

+0

Cảm ơn không hoạt động với phiên bản 6.1.3 Bạn có thể cung cấp những gì cần thiết trong tệp app.config để nó hoạt động không? Cũng cung cấp ví dụ về chuỗi kết nối làm cho câu trả lời của bạn hoạt động –

+0

Tôi đã thêm chuỗi kết nối mẫu. –

3

Bạn cần phải giới thiệu một nhà xây dựng trong bối cảnh của bạn cũng được mong đợi một cuộc tranh luận string connectionString và làm cho nó gọi base(string nameOrConnectionString):

public cerviondemoEntities(string connectionString) : base(connectionString) 
{ 
} 
2

Tôi có vấn đề này như là tốt và sử dụng phương pháp từ Daniel trong các ý kiến.

Ngoài ra, bạn có thể thêm nó vào tập tin .tt thay vì tạo một tập tin và sử dụng 'một phần' - Daniel K 9 tháng 12 '16 tại 19:16

Update * .Context. tt file

chỉ cần thay thế các dòng ...

public <#=code.Escape(container)#>() 
    : base("name=<#=container.Name#>") 
{ 

như sau ...

public <#=code.Escape(container)#>() 
    : this("name=<#=container.Name#>") 
{ 
} 

public <#=code.Escape(container)#>(String nameOrConnectionString) 
    : base(nameOrConnectionString) 
{ 

Tôi hy vọng điều này sẽ hữu ích.

1

Tôi đã sử dụng chuỗi kết nối như thế này, chuỗi kết nối tổ chức thay vì chuỗi kết nối bình thường

SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() 
     { 
    DataSource = "SOURAV-PC", // Server name 
    InitialCatalog = "efDB", //Database 
      UserID = "sourav",   //Username 
      Password = "mypassword", //Password 
     }; 
     //Build an Entity Framework connection string 

     EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() 
     { 
      Provider = "System.Data.SqlClient", 
      Metadata = "res://*/testModel.csdl|res://*/testModel.ssdl|res://*/testModel.msl", 
      ProviderConnectionString = sqlString.ToString() 
     }; 
     return entityString.ConnectionString; 
    } 
Các vấn đề liên quan