2015-12-18 19 views
6

Tôi có một dll sử dụng Entity Framework 6 để thực hiện một số thao tác cơ sở dữ liệu. Tôi đang sử dụng một phương pháp tiếp cận cơ sở dữ liệu đầu tiên. Mô hình và mọi thứ liên quan đến khung Entity, giống như chuỗi kết nối trong App.config, được tạo thông qua wizzard trong Visual Studio.Entity Framework 6 đặt chuỗi kết nối trong mã

Vì vậy, tôi đã biên dịch dll và đặt nó cùng với .config tương ứng trong thư mục mà ứng dụng sử dụng dll mong đợi nó.

Mọi thứ hoạt động tốt cho đến khi tôi đến điểm thực hiện cuộc gọi cơ sở dữ liệu thực. Ở đó tôi gặp lỗi:

Cannot find connection string for MyDatabaseEntity

Chuỗi kết nối được tạo tự động, như tôi đã nói, trong tệp cấu hình của dll. Tôi không thể thay đổi App.config của ứng dụng. Nhưng ứng dụng bàn giao một đối tượng có tất cả thông tin tôi cần để tự xây dựng chuỗi kết nối. Vì vậy, tôi đang tìm cách thiết lập chuỗi kết nối trong mã mà không cần dựa vào tệp cấu hình. Tất cả các hướng dẫn tôi tìm cho một phương pháp tiếp cận cơ sở dữ liệu đầu tiên sử dụng phương pháp này mặc dù. Tôi tìm thấy một bài ở đây nói rằng chỉ đơn giản là cung cấp cho các chuỗi kết nối như một tham số khi tạo đối tượng như

MyDatabaseEntities = new MyDatabaseEntities(dbConnect); 

nhưng'MyDatabaseEntities' không có một nhà xây dựng mà phải mất bất kỳ thông số

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

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

    public virtual DbSet<MyTable> MyTable { get; set; } 
} 

Trả lời

7

Làm thế nào về:

public partial class MyDatabaseEntities : DbContext 
{ 
public MyDatabaseEntities(string connectionString) 
    : base(connectionString) 
{ 
} 

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

public virtual DbSet<MyTable> MyTable { get; set; } 

}

Sau đó khởi tạo cơ sở dữ liệu của bạn như bạn đã làm trước đây:

string myConnectionString = "..."; 
MyDatabaseEntities = new MyDatabaseEntities(myConnectionString); 
+1

Tôi đã không biết rằng chuỗi tại cơ sở() là chuỗi kết nối. Cảm ơn bạn, đã làm điều đó. – FNR

+0

Có, nó cố gắng tìm chuỗi kết nối với tên được chỉ định trong dấu ngoặc đơn trong tệp cấu hình của dự án khởi động –

+0

Tôi đã đặt kết nối như sau: string connection = @ "metadata = res: //*/ShopModel.csdl | res: //*/ShopModel.ssdl | res: //*/ShopModel.msl; provider = System.Data.SqlClient; chuỗi kết nối nhà cung cấp = " nguồn dữ liệu = SIPL35 \ SQL2016; danh mục ban đầu = Join8ShopDB2; id người dùng = Sa; password = Sa123! @ #; MultipleActiveResultSets = True; App = EntityFramework " "; Tham gia8ShopDBCác thành phần dbContext = new Join8ShopDBEntities (connection); nhưng nó cho tôi từ khóa nguồn dữ liệu không được xác định ngoại lệ –

2

Tôi có giải pháp này bằng cách sử dụng mã C# mà không sử dụng tệp cấu hình.

public class SingleConnection 
    { 
     private SingleConnection() { } 
     private static SingleConnection _ConsString = null; 
     private String _String = null; 

     public static string ConString 
     { 
      get 
      { 
       if (_ConsString == null) 
       { 
        _ConsString = new SingleConnection { _String = SingleConnection.Connect() }; 
        return _ConsString._String; 
       } 
       else 
        return _ConsString._String; 
      } 
     } 

     public static string Connect() 
     { 
      //Build an SQL connection string 
      SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder() 
      { 
       DataSource = "SIPL35\\SQL2016".ToString(), // Server name 
       InitialCatalog = "Join8ShopDB", //Database 
       UserID = "Sa",   //Username 
       Password = "[email protected]#", //Password 
      }; 
      //Build an Entity Framework connection string 
      EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder() 
      { 
       Provider = "System.Data.SqlClient", 
       Metadata = "res://*/ShopModel.csdl|res://*/ShopModel.ssdl|res://*/ShopModel.msl", 
       ProviderConnectionString = @"data source=SIPL35\SQL2016;initial catalog=Join8ShopDB2;user id=Sa;[email protected]#;"// sqlString.ToString() 
      }; 
      return entityString.ConnectionString; 
     } 

và sử dụng DbContext sử dụng như thế này:

Join8ShopDBEntities dbContext = new Join8ShopDBEntities(SingleConnection.ConString); 
0

tôi đã có vấn đề tương tự. My Edmx và App.Config đã ở trong một dự án khác. Dự án khởi động của tôi là khác nhau, có 3 chuỗi kết nối khác nhau, chúng ta cần chọn một chuỗi tùy thuộc vào môi trường. Vì vậy, không thể sử dụng một chuỗi kết nối cố định. Tôi đã tạo ra quá tải một phần của lớp Context.cs bằng cách sử dụng cùng một không gian tên. Sau đây là Context.cs mặc định của tôi;

namespace CW.Repository.DBModel 
{ 

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

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

Quá tải một phần của tôi;

namespace CW.Repository.DBModel 
{ 
    public partial class CWEntities : DbContext 
    { 
     public CWEntities(string ConnectionString) 
      : base(ConnectionString) 
     { 
     }   
    } 
} 

Cuối cùng, vì chuỗi kết nối không dành cho EF, tôi đã chuyển đổi chúng thành chuỗi kết nối EF.

public static string GetEntityConnectionString(string connectionString) 
    { 
     var entityBuilder = new EntityConnectionStringBuilder(); 

     // WARNING 
     // Check app config and set the appropriate DBModel 
     entityBuilder.Provider = "System.Data.SqlClient"; 
     entityBuilder.ProviderConnectionString = connectionString + ";MultipleActiveResultSets=True;App=EntityFramework;"; 
     entityBuilder.Metadata = @"res://*/DBModel.CWDB.csdl|res://*/DBModel.CWDB.ssdl|res://*/DBModel.CWDB.msl"; 

     return entityBuilder.ToString(); 
    } 

Cuối cùng, gọi

var Entity = new CWEntities(CWUtilities.GetEntityConnectionString(ConnectionString)); 
Các vấn đề liên quan