2009-07-02 45 views
61

Mã này:MetadataException khi sử dụng Entity Framework Entity kết nối

using (EntityConnection conn = new EntityConnection("name=ELSCommonEntities")) 
{ 
    conn.Open(); 
} 

Cung cấp cho tôi những lỗi sau:

Test method ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod threw exception: System.Data.MetadataException: Unable to load the specified metadata resource.. 

Với stack trace sau:

System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
System.Data.EntityClient.EntityConnection.SplitPaths(String paths) 
System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) 
System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure) 
System.Data.EntityClient.EntityConnection.Open() 
ELS.Service.Business.Base.ServiceBase.StartLogging(String userWindowsLogon) in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business\Base\ServiceBase.cs: line 98 
ELS.Service.Business.IntegrationTest.Base.ServiceBaseIntegrationTest.StartLoggingTestMethod() in C:\C-TOM\ELS-RELEASE1\ELS.Service.Business.IntegrationTest\Base\ServiceBaseIntegrationTest.cs: line 65 

Tuy nhiên, mã này sử dụng cùng một chuỗi kết nối:

using (ELSCommonEntities db = new ELSCommonEntities()) 
{ 
    var res = from c in db.Logging 
       select c; 

    int i = res.Count(); 
} 

Không đưa ra lỗi.

Các chuỗi kết nối là:

<add name="ELSCommonEntities" connectionString="metadata=res://*/Common.CommonModel.csdl|res://*/Common.CommonModel.ssdl|res://*/Common.CommonModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=els5_demo;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

Tôi cũng đã mở ra dll trong phản xạ và siêu dữ liệu trông ok.

+4

Xin vui lòng, xin vui lòng, luôn đăng hoàn toàn ngoại lệ, bao gồm theo dõi ngăn xếp và ngoại lệ bên trong. Đăng kết quả của ex.ToString(). –

+3

Tôi hy vọng bạn không phiền. Tôi đã chỉnh sửa câu hỏi của bạn để sửa định dạng. Bạn nên thụt lề với bốn dấu cách để định dạng mã. Nếu không, hãy chọn mã và nhấn nút với 10101. –

+0

Cảm ơn mẹo –

Trả lời

105

Tìm thấy sự cố.

Chuỗi siêu dữ liệu tiêu chuẩn trông như thế này:

metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl 

Và điều này hoạt động tốt trong hầu hết các trường hợp. Tuy nhiên, trong một số (bao gồm cả tôi) Khuôn khổ thực thể bị lẫn lộn và không biết nên xem xét dll nào. Vì vậy, hãy thay đổi chuỗi siêu dữ liệu thành:

metadata=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl 

Và nó sẽ hoạt động. Đó là liên kết này mà tôi đã đi đúng hướng:

http://itstu.blogspot.com/2008/07/to-load-specified-metadata-resource.html

Mặc dù tôi đã có vấn đề đối diện, không làm việc trong đơn vị kiểm tra, nhưng làm việc trong dịch vụ.

+4

"Một số trường hợp" là khi bạn có nhiều hơn một tệp edmx có cùng tên (ví dụ Model1). – alpav

+1

"Một số trường hợp" của tôi chỉ có một tệp .edmx trong giải pháp. Tôi không biết chuyện gì đã xảy ra, nhưng nó thật khủng khiếp. ;) – jfar

+3

Liên kết bạn đã đưa tôi đến câu trả lời, vì vậy bạn đang nhận được upvote của tôi! Tôi đã chiến đấu với điều này trong nửa ngày. Tôi đã thử res: // NameOfDLL/... nhưng không thành công. Tuy nhiên, cuối cùng tôi đã nhận nó để làm việc với res: // NameOfAssembly/... Trong trường hợp này, họ là cùng một tên, ngoại trừ tên lắp ráp không có .dll cuối cùng. –

0

Như Shiraz Bhaiji đã trả lời, siêu dữ liệu = res: ///Model.csdl | res: ///Model.ssdl | res: //*/Model.msl là trường hợp. Tuy nhiên, tôi vẫn gặp sự cố khi xây dựng chuỗi thích hợp dựa trên Mô hình hóa địa phương, không gian tên và tên assemby của tôi. Giải pháp rất đơn giản là đổi tên tệp .edmx trong Visual Studio (sau khi đổi tên và quay lại tên gốc), kích hoạt tự động làm mới chuỗi trong Web.config

43

Tôi có cùng thông báo lỗi và vấn đề cũng là phần siêu dữ liệu của chuỗi kết nối, nhưng tôi phải đào sâu hơn một chút để giải quyết nó và muốn chia sẻ cái nugget nhỏ này:

Chuỗi siêu dữ liệu được tạo thành từ ba phần giống nhau này:

res:// 
     (assembly)/ 
     (model name).(ext) 

đâu ext là "csdl", "ss dl "và" msl ".

Đối với hầu hết mọi người, lắp ráp có thể là "*", dường như chỉ ra rằng tất cả các cụm được tải sẽ được tìm kiếm (tôi chưa thực hiện một số lượng lớn thử nghiệm này). Phần này không phải là một vấn đề đối với tôi, vì vậy tôi không thể bình luận về việc bạn cần tên lắp ráp hay tên tệp (tức là, có hoặc không có ".dll"), mặc dù tôi đã thấy cả hai đề xuất.

Tên mẫu phải là tên và không gian tên tệp .edmx của bạn, liên quan đến hội đồng của bạn. Vì vậy, nếu bạn có một My.DataAccess lắp ráp và bạn tạo DataModels.edmx trong một Models thư mục, tên đầy đủ của nó là My.DataAccess.Models.DataModels. Trong trường hợp này, bạn sẽ có "Models.DataModels. (Ext)" trong siêu dữ liệu của mình.

Nếu bạn di chuyển hoặc đổi tên tệp .edmx, bạn cần phải cập nhật chuỗi siêu dữ liệu theo cách thủ công (theo kinh nghiệm của tôi) và nhớ thay đổi không gian tên tương đối sẽ tiết kiệm được một vài cơn đau đầu.

+6

CẢM ƠN BẠN! Có 100 câu trả lời cho điều này có sẵn trên internet, nhưng đây là phụ lục hữu ích nhất cho bất kỳ người trong số họ. Ví dụ rõ ràng: Trong 'DalProject.dll' bạn có thư mục' Khách hàng' có tệp 'Client.edmx' trong đó. Vì vậy, sau đó bạn thay thế '// */Client. (Csdl/ssdl/msl) 'bằng' //DalProject/Client.Client. (Csdl/ssdl/msl) ' – Maverick

+0

Có vẻ như" My.DataAccess. " không được yêu cầu; chỉ phần "Models.DataModels" (có lẽ nó hoạt động tương đối so với mỗi vùng tên gốc của trình tìm kiếm). –

14

Có một số sản phẩm khai thác có thể xảy ra. Tôi nghĩ rằng lỗi phổ biến nhất là trong phần này của chuỗi kết nối:

res://xxx/yyy.csdl|res://xxx/yyy.ssdl|res://xxx/yyy.msl;

Điều này không có phép thuật. Một khi bạn hiểu những gì là viết tắt của bạn sẽ nhận được chuỗi kết nối ngay.

Đầu tiên là xxx một phần. Đó là không có gì khác hơn là một tên lắp ráp, nơi bạn đã xác định bạn ngữ cảnh ngữ cảnh EF. Thông thường nó sẽ là một cái gì đó như MyProject.Data. Giá trị mặc định là * viết tắt của tất cả các cụm được nạp. Nó luôn luôn tốt hơn để xác định một tên lắp ráp cụ thể.

Bây giờ, phần yyy. Đó là tên tài nguyên trong hội đồng xxx. Nó thường sẽ giống như một đường dẫn tương đối đến tệp .edmx của bạn có dấu chấm thay vì dấu gạch chéo. Ví dụ. Mô hình/Danh mục - Mô hình.Catalog Cách dễ nhất để có được chuỗi chính xác cho ứng dụng của bạn là xây dựng cụm xxx. Sau đó mở tập tin dll lắp ráp trong một trình soạn thảo văn bản (tôi thích trình xem mặc định của Total Commander) và tìm kiếm ".csdl". Thông thường sẽ không có nhiều hơn 1 lần xuất hiện của chuỗi đó.

chuỗi kết nối EF cuối cùng của bạn có thể trông như thế này:

res://MyProject.Data/Models.Catalog.DataContext.csdl|res://MyProject.Data/Models.Catalog.DataContext.ssdl|res://MyProject.Data/Models.Catalog.DataContext.msl;

+2

Tìm kiếm trong dll. Mẹo cực đỉnh. Cảm ơn :) – uniquelau

0

tôi đã cùng một vấn đề với ba dự án trong một giải pháp và tất cả những đề nghị đã không làm việc cho đến khi tôi làm một tài liệu tham khảo trong file tài liệu tham khảo của dự án trang web cho dự án nơi tệp edmx nằm.

0

Tôi đã chuyển cơ sở dữ liệu của mình Đầu tiên DataModel đến một dự án khác giữa chừng thông qua phát triển. Lập kế hoạch nghèo nàn (hoặc thiếu) trong phần của tôi.

Ban đầu tôi đã có giải pháp với một dự án. Sau đó, tôi đã thêm một dự án khác vào giải pháp và tạo lại cơ sở dữ liệu của tôi First DataModel từ Sql Server Dataase.

Để khắc phục sự cố - Siêu dữ liệu Ngoại lệ khi sử dụng Entity Framework Entity Connection. Tôi đã sao chép ConnectionString của mình từ Dự án Web.Config vào dự án ban đầu Web.Config.Tuy nhiên, điều này xảy ra sau khi tôi cập nhật tất cả các tham chiếu trong dự án gốc thành dự án DataModel mới.

0

Nó có thể chỉ là lỗi chuỗi kết nối, được giải quyết bằng quy trình trên, nhưng nếu bạn đang sử dụng dll trong nhiều dự án thì đảm bảo chuỗi kết nối được đặt tên đúng cách sẽ sửa lỗi đó.

0

Tôi gặp sự cố này khi di chuyển mô hình đầu tiên của cơ sở dữ liệu .edmx từ dự án này sang dự án khác.

Tôi chỉ đơn giản là đã làm như sau:

  1. xóa các chuỗi kết nối trong app.config hoặc web.config
  2. xóa các 'Model.edmx'
  3. lại thêm mô hình cho dự án.
Các vấn đề liên quan