28

Tôi đã chuyển DAL sang sử dụng LINQ to Entity Framework. Vì ứng dụng của tôi kết nối với các cơ sở dữ liệu khác nhau tùy thuộc vào người dùng hiện tại, tôi cần phải tạo động DataContext tại thời gian chạy và chuyển vào chuỗi kết nối thích hợp. Tuy nhiên, khi tôi cố gắng tạo một kết nối Entity Framework bằng cách sử dụng chuỗi kết nối cũ của tôi, kết nối không thành công. Nó phàn nàn rằng nó không nhận ra chìa khóa trong chuỗi kết nối, "máy chủ" là chính xác.Tại sao kết nối khung thực thể yêu cầu thuộc tính siêu dữ liệu?

tôi phát hiện ra rằng tôi cần phải làm điều này để có được kết nối Entity Framework để làm việc:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
entityBuilder.Provider = "System.Data.SqlClient"; 
entityBuilder.ProviderConnectionString = clientConnectionString; 
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl..."; 
Entities entities = new Entities(entityBuilder.ToString()); 

Tại sao điều này?
Thuộc tính Siêu dữ liệu là gì?
Nó sẽ là một vấn đề mà nó luôn luôn giống nhau cho nhiều kết nối khác nhau?
Nó nên là gì?
Có cách nào xung quanh vấn đề này không?

Cảm ơn trước!

Cập nhật 1: Cảm ơn bạn đã cập nhật Randolpho, nhưng ...
Lý do tôi gặp sự cố này là tôi không thể lưu trữ chuỗi kết nối trong tệp cấu hình. Chuỗi kết nối được xác định động trong thời gian chạy mà người dùng đang kết nối.

Đây là kịch bản chính xác của tôi:
Nếu người dùng A được kết nối, ứng dụng kéo dữ liệu từ cơ sở dữ liệu A. Nếu người dùng B được kết nối, ứng dụng kéo dữ liệu từ cơ sở dữ liệu B.
Các chuỗi kết nối được lưu trữ trong một chính cơ sở dữ liệu và số lượng có khả năng vô hạn. Mỗi khi tôi thêm một người dùng, tôi không muốn phải đi vào web.config, chưa kể thực tế rằng nó cuối cùng sẽ nhận được HUGE!

+0

Vì ánh xạ giống nhau đối với mỗi kết nối và nó sẽ không thay đổi, nên tôi không sử dụng cùng một Siêu dữ liệu cho tất cả chúng phải không? –

+0

vâng, đúng là – user230910

Trả lời

9

Bạn sẽ tìm thấy những liên kết rất nhiều thông tin:

http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.connectionstring.aspx

http://weblogs.asp.net/pgielens/archive/2006/08/21/ADO.NET-Entity-Framework-Metadata.aspx

Bottom line? Entity Framework cần siêu dữ liệu để xây dựng ánh xạ thực thể của bạn.

Ngoài ra, bạn nên xem xét di chuyển thông tin kết nối của bạn ra tệp cấu hình của bạn thay vì xây dựng nó trong mã. Liên kết đầu tiên sẽ chỉ cho bạn cách thực hiện điều đó.

+2

@ocdecio: Đừng giảm giá EF cho điều đó; NHibernate hoạt động khá nhiều theo cùng một cách. Tôi chắc chắn có những lý do khác, mặc dù. :) – Randolpho

+2

@ocdecio, tôi rất muốn thấy một trình ánh xạ ORM không sử dụng một số loại tệp ánh xạ. Trừ khi bạn làm 1: 1 với những cái bàn, cái gì đó phải nói điều gì đó cần làm. – jfar

24

Mở rộng trên Randolpho của câu trả lời:

Thuộc tính siêu dữ liệu đặc biệt chỉ ra vị trí của .SSDL (lưu trữ Model,) .CSDL (Conceptual Model,) và .MSL (Mapping Model) tập tin. Ba tệp này về cơ bản là Mô hình dữ liệu thực thể. Bộ định dạng kiểu URI "res: //" chỉ ra rằng các tệp được nhúng dưới dạng tài nguyên trong assembly EDM đã biên dịch.

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