2013-01-21 36 views
17

Tôi đang làm việc trên một ứng dụng sẽ sử dụng cùng một lược đồ cơ sở dữ liệu trên nhiều cơ sở dữ liệu. Vì lý do này, tôi đã tạo một cơ sở dữ liệu có tên là MyTemplate. Khi một người dùng mới được tạo, họ sẽ có thể hiện riêng của họ về cơ sở dữ liệu. Vì vậy, một cơ sở dữ liệu được gọi là một cái gì đó như MyTemplate_[UserName] sẽ được tạo ra. Khi người dùng đăng nhập, tôi cần phải trỏ truy vấn của họ đến cơ sở dữ liệu của họ. Vì lý do này, tôi biết rằng tôi cần thiết lập chuỗi kết nối khi chạy. Vấn đề của tôi là, tôi cũng muốn sử dụng khung Entity.Thiết lập khung thực thể cho chuỗi kết nối động

Hiện tại, tôi đã tạo một .edmx mới bằng MyTemplate làm nguồn. Tôi nghĩ rằng tôi sẽ có thể cập nhật mã và thiết lập chuỗi kết nối ở đó. Thật không may, tôi không thể tìm ra cách để thiết lập nó. Hàm khởi tạo cho TemplateEntities không có quá tải cho phép tôi truyền vào chuỗi kết nối. Tôi nhận thấy rằng TemplateEntities bắt nguồn từ DbContext, tôi không nghĩ rằng đây sẽ là vấn đề.

string connectionString = GetUsersConnectionString(); 
using (TemplateEntities entities = new TemplateEntities()) 
{ 
    TemplateEntity entity = new TemplateEntity(); 

    // Save to the database 
    entities.TemplateEntity.Add(entity); 
    entities.SaveChanges(); 
} 

Tôi có đang tạo .edmx không chính xác không? Hoặc tôi thiếu một cái gì đó hoàn toàn? Tất cả mọi thứ tôi Google cho thấy một quá tải mà nên cho phép một chuỗi kết nối được thông qua. Tuy nhiên, tôi không có quá tải có sẵn.

Trả lời

30

Lớp được tạo TemplateEntities được đánh dấu là partial.

Tất cả bạn phải làm là thêm tập tin khác với một phần của định nghĩa lớp một phần đó cho thấy nhiều nhà xây dựng bạn muốn sử dụng:

partial class TemplateEntities 
{ 
    public TemplateEntities(string nameOrConnectionString) 
    : base(nameOrConnectionString) 
    { 
    } 
} 

Sau đó, vượt qua chuỗi kết nối của bạn vào constructor này.

Bạn muốn đặt mã này vào một tệp khác để tệp không bị ghi đè khi bạn cập nhật mô hình edmx của mình.

+2

Khi tôi làm điều này, tôi nhận được lỗi có nội dung: 'đối tượng' không chứa hàm tạo có 1 đối số. Tôi đang làm gì sai? – user70192

+3

Định nghĩa lớp một phần với hàm tạo mới phải nằm trong cùng một không gian tên như lớp được tạo ra - nếu không nó sẽ khai báo một lớp mới (mặc định xuất phát từ 'đối tượng') –

+0

+1: Tôi thắc mắc vì sao loại hàm dựng này là không có trong mẫu mặc định, nhưng đây là một giải pháp tốt đẹp và sạch sẽ, thx. – reSPAWNed

13

Câu trả lời của Nicholas Butler khá chính xác. Ngoài những gì anh ta nói, tôi đã phải đối mặt với vấn đề lấy một chuỗi kết nối hiện có cho khung thực thể và chỉ trỏ nó vào một cơ sở dữ liệu khác có cùng cấu trúc. Tôi đã sử dụng mã sau đây để chỉ thay đổi nguồn dữ liệu của chuỗi hiện tại:

var originalConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CSName"].ConnectionString; 
var ecsBuilder = new EntityConnectionStringBuilder(originalConnectionString); 
var sqlCsBuilder = new SqlConnectionStringBuilder(ecsBuilder.ProviderConnectionString) 
{ 
    DataSource = "newDBHost" 
}; 
var providerConnectionString = sqlCsBuilder.ToString(); 
ecsBuilder.ProviderConnectionString = providerConnectionString; 

string contextConnectionString = ecsBuilder.ToString(); 
using (var db = new SMSContext(contextConnectionString)) 
{ 
    ... 
} 
+0

lớp này là 'EntityConnectionStringBuilder & SqlConnectionStringBuilder' dotnet được xây dựng trong lớp hoặc được viết bởi u? –

+0

@MonojitSarkar Họ là các lớp .NET, không phải do tôi viết. Đó là vẻ đẹp của nó. :-) –

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