2010-06-25 30 views
8

Tại nơi làm việc, chúng tôi hiện đang có một ứng dụng web rất lớn với kết nối đến một cơ sở dữ liệu khổng lồ. Chúng tôi đã và đang sử dụng Entity Framework trong một thời gian và để làm cho mọi thứ dễ dàng hơn, chúng tôi chia cơ sở dữ liệu thành nhiều mô hình Entity. Điều này hoạt động tốt cho chúng tôi nhưng chúng tôi đã gặp sự cố. Mỗi mô hình EF cần chuỗi kết nối của riêng nó do phần siêu dữ liệu của chuỗi kết nối. Quản lý chuỗi kết nối rất nhiều là một nỗi đau.Chuỗi kết nối đơn lẻ với nhiều mô hình khung thực thể?

Bây giờ tôi có một giải pháp mà tôi nghĩ sẽ hoạt động. Tôi sẽ tạo một lớp sẽ có thông tin siêu dữ liệu được lưu dưới dạng thuộc tính cũng được nối với chuỗi kết nối chuẩn trong web.config. Vì vậy, khi chúng ta sử dụng chuỗi kết nối "Database.EntityConnectionString", nó sẽ cho tôi chuỗi Entity Connection nhưng chúng ta chỉ phải quản lý một chuỗi kết nối duy nhất trong web.config. Chúng tôi vẫn sẽ phải quản lý lớp học với siêu dữ liệu nhưng Mô hình không thay đổi nhiều và chúng tôi không tạo chúng thường xuyên để bảo trì sẽ ổn. Câu hỏi của tôi, là có một cách tốt hơn để đối phó với vấn đề này hoặc làm thế nào bạn sẽ làm điều đó?

Cảm ơn!

Trả lời

7

Đây là cách tôi đã thực hiện giải pháp của tôi cho vấn đề này:

namespace DBLibrary 
{ 
    public enum Models 
    { 
     Model1, 
     Model2  
    } 

    public static class Database 
    { 
     public static string EntitiesConnectionString(Models model) 
     { 
      SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["Default"].ConnectionString); 

      builder["MultipleActiveResultSets"] = true; 
      builder["Connect Timeout"] = 30; 

      EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
      entityBuilder.Provider = "System.Data.SqlClient"; 
      entityBuilder.ProviderConnectionString = builder.ConnectionString; 

      switch (model) 
      { 
       case Models.Model1: 
        entityBuilder.Metadata = "res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl"; 
        return entityBuilder.ToString(); 
       case Models.Model2: 
        entityBuilder.Metadata = "res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl"; 
        return entityBuilder.ToString(); 
       default: 
        throw new Exception("Invalid model, no connection string defined"); 
      } 
     } 
    } 
} 

tôi vẫn cần phải dọn dẹp mã và tất cả nhưng tôi nghĩ rằng đây cung cấp cho bạn một ý tưởng tốt về cách thức này có thể được thực hiện. Tôi vẫn sẽ rất quan tâm nếu có những cách khác nhau và tốt hơn để làm điều này.

Cảm ơn!

+0

của bạn tôi biết đó là một chút cũ nhưng làm thế nào bạn sử dụng nó – lostmylogin

0

Tôi đã gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách làm theo cách sau:

Tôi đã tạo hai tệp edmx, nhưng khi tạo tệp edmx thứ hai, tôi bỏ qua chuỗi kết nối sẽ được lưu trong tệp cấu hình. Bằng cách này, tập tin cấu hình của tôi sẽ chỉ giữ một chuỗi kết nối. Sau đó, tôi biến đổi dòng sau trong chuỗi kết nối của tôi:

<add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

Chỉ cần thay thế "res: //model1.csdl" với "res: // * /" và nó hoạt động như một nét duyên dáng.

Bạn có thể chỉ định tên kết nối này trong constructor của lớp dbcontext của bạn như:

public MyDbContext() : base("name=NameOfYourConnectionString") // Name of your connection string 
{ } 

Lưu ý: Tôi đang sử dụng Entity Framework 5.0.

+0

này sẽ không hoạt động nếu mô hình của bạn chứa các loại chồng chéo (ví dụ, bạn đã cùng một bảng tham chiếu trong nhiều mô hình) – K0D4

+1

Vâng, bạn có thể thay đổi tên Thực thể trùng lặp trong chính Edmx. Tôi cũng có cùng một bảng được tham chiếu trong nhiều mô hình, nhưng tôi đổi tên tên entityset trong thuộc tính thực thể edmx để tránh thực thể trùng lặp! – SoftSan

1

Add Mặc định Xây dựng trong Class

public class ItemContext : DbContext 
{ 
    public DbSet<Item>Items get; set; } 
    public DbSet<ItemDetail> ItemDetails { get; set; } 

    public ItemContext() 
    { 

     this.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
    } 
} 
Các vấn đề liên quan