2009-08-24 38 views
6

tôi có một giải pháp NET chứa hai dự án:Hai dự án .NET, một chuỗi kết nối DB?

    dự án
  • Một ASP.NET MVC, 'Website'
  • Một thư viện lớp,

Dự án 'Models' 'mô hình' chứa một bối cảnh dữ liệu LINQ-to-SQL cùng với một vài lớp một phần mở rộng các đối tượng cơ sở dữ liệu.

Chuỗi kết nối được xác định trong web.config của dự án 'Trang web'.

Tuy nhiên dự án 'Mô hình' dường như có app.config riêng của mình nơi kết nối cơ sở dữ liệu được xác định riêng.

Điều này có nghĩa là nếu chuỗi kết nối thay đổi, tôi sẽ phải cập nhật cả hai dự án.

Có cách nào tôi có thể tập trung chuỗi kết nối vào một nơi và vẫn có cả hai dự án sử dụng không?

Trả lời

4

Tạo một lớp học một phần giống với ngữ cảnh dữ liệu của bạn và sử dụng mã này để buộc sử dụng chuỗi web.config trái ngược với app.config. Đặt lớp từng phần trong cùng một vị trí với mô hình của bạn trong thư viện lớp.

public partial class YourDataContext 
{ 
    partial void OnCreated() 
    { 
     ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"]; 

     if (cs != null) 
     { 
      this.Connection.ConnectionString = cs.ConnectionString; 
     } 
    } 
} 

Xem câu hỏi này để biết thêm Preferred Method for connection string in class library
RichardOD đăng một liên kết với những gì tôi nghĩ tốt nhất mô tả vấn đề của chúng tôi LINQ To SQL and the Web.Config ConnectionString Value

+0

Bỏ phiếu xuống là gì? – Breadtruck

+2

Nhưng làm thế nào điều này sẽ làm việc, kể từ khi các lớp học một phần phải thuộc về cùng một hội? Tôi muốn lắp ráp 'Mô hình' để sử dụng chuỗi kết nối từ web.config trong hội 'Website'. – Jonathan

+0

BTW, tôi đã không làm bất kỳ downvoting. – Jonathan

1

Tôi muốn nói rằng bạn nên giữ cấu hình của sản phẩm trong web.config của dự án web và sau đó tiêm cấu hình bạn sử dụng vào dự án mô hình.

+0

Điều này tôi làm. Xem câu trả lời của tôi cho ví dụ mã thực tế – Breadtruck

2

Tốt thôi. Đặt chuỗi kết nối của Model vào Web.config và quên (xóa) tệp cấu hình của Mô hình.

Các DataContext cũng mất trong một chuỗi kết nối trong constructor của nó, do đó bạn có thể xác định nó theo cách này quá (có lẽ không trên cùng một dòng mặc dù):

DataContext context = new DataContext(ConfigurationManager.ConnectionStrings["TheKey"].ConnectionString); 

Edit- dựa trên ý kiến ​​của bạn để trả lời khác có vẻ như bạn đang làm điều gì đó sai. Nếu bạn đang làm điều đó, thì mã được tạo sẽ sử dụng giá trị cài đặt mặc định.

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")]. 

Bạn có thể đang phạm sai lầm not specifying the connection string properly trong tệp Web.config.

+0

@RichardOD: Tôi đang bình luận, nhưng tôi đã không thực sự đặt câu hỏi, mặc dù tôi đã hỏi một trong những tương tự như thế này một trong khi trở lại. Tôi chưa bao giờ thử xóa tệp appconfig. Dì của tôi đã đề xuất nó, nhưng tôi cũng đã có một số mô hình bộ dữ liệu trong dự án và trong trường hợp này bạn phải tạo nhiều lớp tableadapter một phần, và tôi sẽ không làm điều đó, vì vậy tôi chưa thử xóa ứng dụng. config, nhưng tôi tưởng tượng nó sẽ hoạt động. – Breadtruck

0

Ok, tôi đoán ở đây, nhưng có vẻ như cả hai dự án đều sử dụng một chuỗi kết nối giống nhau, phải không?

Trong trường hợp đó, chỉ chỉ định chuỗi kết nối trong web.config; thư viện class.config sẽ không được đọc bởi ASP.NET.

+0

Đó không phải là trải nghiệm của tôi trừ khi tôi có cấu hình sai. – Breadtruck

+0

Thật sao? Bạn có đang sử dụng một thành phần của bên thứ ba thực hiện nó cho bạn không? Bởi vì trong kinh nghiệm của tôi chỉ app.config cho thực thi (hoặc trong trường hợp của ASP.NET web.config) được đọc bởi hệ thống theo mặc định. Nếu có app.config được liên kết với một thư viện lớp (.DLL), nội dung của app.config đó phải là A) được nạp theo cách thủ công (đó là những thành phần của bên thứ ba thực hiện điều này cho bạn) hoặc B) sao chép vào app.config/web.config của ứng dụng chính. – Randolpho

+0

@Randolpho: Vui lòng xem http://stackoverflow.com/questions/1148559 để biết thêm chi tiết vì nó liên quan đến tôi. – Breadtruck

0

Tôi nghĩ chuỗi kết nối trong thư viện Mô hình chỉ được nhà thiết kế sử dụng. Trong suốt thời gian chạy, chuỗi được tải từ web.config. Vì vậy, bạn không nhất thiết cần phải có chuỗi đồng bộ.

+0

Đó không phải là những gì tôi đã tìm thấy sau khi triển khai một giải pháp như thế này vào sản xuất. Thư viện tiếp tục kéo kết nối của nó từ app.config. – Breadtruck

0

Bạn không cần app.config thư viện lớp. Chỉ cần đặt cấu hình của bạn tại web.config. Ngoài ra, nếu bạn cần một số phần cấu hình từ ứng dụng của thư viện.config, chỉ cần đặt nó trên web.config. ConfigurationManager sẽ đọc nó từ đó.

0

Nếu thư viện Lớp mô hình của bạn được tham chiếu trong Ứng dụng web, bạn có thể chỉ cần xóa tham chiếu trong tệp App.Config và đảm bảo bạn có nội dung tương tự như được đặt trong web của mình. config. Bằng cách đó, khi trình biên dịch tìm trong web.config, nó sẽ tìm thấy chuỗi kết nối mà nó cần cho dự án MVC và do đó không cần phải nhìn xa hơn về nó.

+0

Tôi đã thử điều này, nhưng có vẻ như đang nhận chuỗi kết nối từ tệp 'Cài đặt' trong thuộc tính của dự án Mô hình. Có một số mã như thế này trong lớp: 'global :: Models.Properties.Settings.Default.WebConnectionString, mappingSource)' – Jonathan

+0

@jonathanconroy: đó là lý do tại sao câu trả lời của tôi sẽ giúp bạn giải quyết vấn đề này. – Breadtruck

0

Cá nhân, tôi mở rộng DataContext trong Respository tôi thì làm một cái gì đó như:

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

Bằng cách đó kho của tôi có thể được khởi tạo và tôi không bao giờ lo lắng về việc thiết lập một kết nối, hoặc phải đối phó với nó nào. Để thay đổi/từ dev/cơ sở dữ liệu trực tiếp, tôi chỉ thay đổi web.config của mình.

0

Ứng dụng.config trong thư viện sẽ không ảnh hưởng đến quá trình sản xuất - các chuỗi kết nối đó thực sự có cho trình thiết kế linq2sql. Không có gì để xem, di chuyển cùng, đây không phải là droids chúng tôi đang tìm kiếm. . .

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