MetadataException: Không thể tải tài nguyên siêu dữ liệu đã chỉ định


681

Đột nhiên, tôi tiếp tục nhận được một lớp học MetadataExceptionđược tạo ra ObjectContext. Chuỗi kết nối trong App.Config có vẻ chính xác - đã không thay đổi kể từ lần cuối hoạt động - và tôi đã thử tạo lại một mô hình mới (tệp edmx) từ cơ sở dữ liệu cơ bản mà không thay đổi.

Còn ai có ý tưởng nào không?

Thêm chi tiết: Tôi chưa thay đổi bất kỳ thuộc tính nào, tôi chưa thay đổi tên của bất kỳ hội đồng đầu ra nào, tôi đã không cố gắng nhúng EDMX vào tổ hợp. Tôi chỉ đợi 10 giờ từ khi rời khỏi công việc cho đến khi tôi trở lại. Và rồi nó không còn hoạt động nữa.

Tôi đã thử tạo lại EDMX. Tôi đã thử tạo lại dự án. Tôi thậm chí đã thử tạo lại cơ sở dữ liệu từ đầu. Không có may mắn, bất cứ điều gì.


14
Nếu một câu hỏi SO về một sản phẩm cụ thể có hơn 200 nghìn lượt xem, thì sản phẩm đó không hoạt động theo cách mà người dùng đang mong đợi. Tôi muốn xem Microsoft giải quyết điều này. Đây là một liên kết để cung cấp cho họ các đề xuất nếu bạn có thời gian: visualstudio.uservoice.com/forums/121579-visual-studio .
Tony L.

Vấn đề của tôi đã được giải quyết, bằng cách thay thế chuỗi kết nối được sao chép từ dự án lớp db.
Hardik

Câu trả lời:


856

Điều này có nghĩa là ứng dụng không thể tải EDMX. Có một số điều có thể gây ra điều này.

  • Bạn có thể đã thay đổi thuộc tính MetadataArtifactProcessing của mô hình thành Sao chép vào Thư mục đầu ra.
  • Chuỗi kết nối có thể sai. Tôi biết bạn nói rằng bạn đã không thay đổi nó, nhưng nếu bạn đã thay đổi những thứ khác (giả sử tên của một hội đồng), nó vẫn có thể sai.
  • Bạn có thể đang sử dụng tác vụ hậu biên dịch để nhúng EDMX vào cụm, nó không còn hoạt động vì một số lý do.

Nói tóm lại, thực sự không có đủ chi tiết trong câu hỏi của bạn để đưa ra câu trả lời chính xác, nhưng hy vọng những ý tưởng này sẽ giúp bạn đi đúng hướng.

Cập nhật: Tôi đã viết một bài đăng blog với các bước đầy đủ hơn để khắc phục sự cố .


70
Chuỗi kết nối, mặc dù những nỗ lực của tôi để so sánh nó với một tiện ích so sánh nội dung lần trước, đã sai.
J. Steen

16
Đó là kết nối cho tôi quá. Khi bạn có Kiểm tra tích hợp cũng cần kết nối trong App.config của riêng mình, mọi thứ có thể không đồng bộ khi bạn cập nhật edmx của mình.
Ray

11
OK, tôi đã sửa nó bằng cách chỉ cần đặt "Nhúng"; biên dịch, sau đó thiết lập lại nó cho người khác. Điều đó đã giải quyết vấn đề của tôi.
Shimmy Weitzhandler

6
Có cùng một vấn đề, đã thử giải pháp của bạn, muốn cho +1, nhận ra tôi đã làm điều đó trong quá khứ. Tôi thậm chí không nhớ có vấn đề này trước đây;). Lần này trong trường hợp của tôi, đó là chuỗi kết nối chính xác trong Thư viện lớp với edmx và sai trong ứng dụng web khi nó được sử dụng.
Episodex

9
Hướng dẫn tuyệt vời. Đối với tôi, tôi đã sao chép một chuỗi kết nối khác sử dụng res: // * / Database.MyModel2 ..., khi tôi THỰC SỰ muốn res: // * / MyModel1 ... (Cơ sở dữ liệu là một thư mục trong dự án Kiểm tra Tích hợp của tôi)
emragins

360

Thay đổi nhỏ này giúp đỡ với vấn đề này.

Tôi có Giải pháp với 3 dự án.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

thay đổi thành

connectionString="metadata=res://*/;

11
Nó đã sửa nó cho tôi, nhưng nó có ý nghĩa gì?
Lance Fisher

18
@Lance: Tôi giải thích điều này một cách chi tiết trong bài đăng trên blog này
Craig Stuntz

4
@jocull: Không, nó sẽ không hoạt động trong nhiều trường hợp và sẽ chậm ở những người khác. Đọc bài viết trên blog của tôi để hiểu lý do tại sao.
Craig Stuntz

6
Đã chuyển .edmx của tôi sang thư mục Model và quên cập nhật chuỗi kết nối. Con trỏ lớn. Cảm ơn. Tôi sẽ mất nhiều giờ để tìm ra.
muruge

11
Bạn đã cứu một nhân viên Microsoft tội nghiệp khỏi một người tiêu dùng rất tức giận.
Người đàn ông Muffin

115

Bạn có thể có ngoại lệ này khi Edmx nằm trong một dự án và bạn đang sử dụng nó từ một dự án khác.

Lý do là Res://*/một uri trỏ đến các tài nguyên trong hội đồng HIỆN TẠI. Nếu Edm được định nghĩa trong một hội đồng khác với mã đang sử dụng nó, res: // * / sẽ không hoạt động vì không thể tìm thấy tài nguyên.

Thay vì chỉ định '*', bạn cần cung cấp tên đầy đủ của hội đồng thay thế (bao gồm mã thông báo khóa công khai). Ví dụ:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

Cách tốt hơn để xây dựng chuỗi kết nối là với EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

Nếu bạn vẫn gặp ngoại lệ, hãy mở cụm trong phản xạ và kiểm tra tên tệp cho các tệp .csdl, .ssdl và .msl của bạn. Khi tài nguyên có tên khác với tên được chỉ định trong giá trị siêu dữ liệu, nó sẽ không hoạt động.


8
Vui lòng xem xét rằng "YourEdmxFileName" phải là tên đủ điều kiện, ví dụ "YourNamespace.YourEdmxFileName", nếu bạn sử dụng không gian tên trong cụm của mình. Tuy nhiên, bạn phải loại bỏ một phần của không gian tên bằng với tên của tổ hợp của bạn.
Marcel

5
MSDN nói đoạn thứ hai là sai. "Khi bạn sử dụng ký tự đại diện (*), Khung thực thể phải xem qua tất cả các cụm để tìm tài nguyên với tên chính xác."
Craig Stuntz

Tôi khá chắc chắn rằng không gian tên không liên quan, nhưng đường dẫn tệp được nhúng là. Vì vậy, ngay cả khi bạn kiểm tra tệp * .Designer.cs của tệp edmx được liên kết và nhận thấy rằng không gian tên lớp được tạo tự động là MyCompany ... bất cứ điều gì, đó không phải là thứ bạn nên sử dụng. Thay vào đó, đường dẫn là assemblyname, tên thư mục giải pháp / tên tệp. Ví dụ: "metadata = res: // * / EntityModels. <Tên tệp> .csdl |" + "res: // * / EntityModels. <tên tệp> .ssdl |" + "res: // * / EntityModels. <tên tệp> .msl;"
Daniel

1
@Daniel, điều đó chủ yếu là chính xác, nhưng lưu ý rằng không gian tên và đường dẫn tệp được nhúng đôi khi giống nhau. Bạn phải xem xét với Reflector (hoặc thay thế miễn phí cho điều đó) để chắc chắn.
Craig Stuntz

có vẻ như nó hoạt động chỉ bằng cách sử dụng tên lắp ráp, không có phiên bản, publickeytoken, v.v. Giống như:res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa

67

Tôi đã có một lỗi tương tự. Tôi đã tạo lại dự án (câu chuyện dài), và kéo mọi thứ từ dự án cũ. Tôi đã không nhận ra rằng mô hình của tôi đã ở trong một thư mục có tên 'Model' trước đây và bây giờ nằm ​​trong một thư mục có tên 'Model'. Khi tôi đã thay đổi kết nối trong Web.Config của mình từ đây:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

đến đây:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

Mọi thứ đã hoạt động (đổi Modelthành Models). Lưu ý rằng tôi đã phải thay đổi ba vị trí trong chuỗi này.


2
Tôi đã chuyển mô hình Entity Framework của mình từ Model sang DAL. Nhưng sau đó khi tôi viết một bài kiểm tra (một tuần sau) trong dự án thử nghiệm để kiểm tra dự đoán Linq. Tôi đã nhận được lỗi này. Tôi đã sửa các dự án thử nghiệm App.config với giao diện của nó trong web.config của dự án chính - như bạn đã nói ở ba nơi. Vì vậy, câu trả lời đơn giản của bạn đã đưa tôi đi đúng hướng.
Patrik Lindström

Có, cảm ơn - kiểm tra tên tệp của bạn. Bằng cách nào đó tôi đã có tên cũ.
PeterX

7
Có điểm khác biệt gì giữa hai thứ này không?!
Erwin Rooijakkers

2
@ErwinRooijakkers Người mẫu vs Người mẫu
Marc

Tìm hiểu tôi đã làm tương tự từ sau khi đọc blog của Craig, nhưng +1 để tìm hiểu điều quan trọng cần nhớ là các thay đổi được thực hiện trong thư viện lớp "thực thể" của bạn không được thực hiện tự động trong các tệp cấu hình của các dự án tham chiếu đến nó. / thở dài Vui mừng tôi không cô đơn.
ruffin

26

Và một cách nhanh chóng để kiểm tra tên model mà không cần Reflector .... hãy tìm thư mục

... obj / {config output} / edmxResourceToEmbed

và kiểm tra xem các tệp tài nguyên .csdl, .msl và .ssdl có ở đó không. Nếu chúng nằm trong một thư mục con, tên của thư mục con phải được thêm vào tên mô hình.

Ví dụ: ba tệp tài nguyên của tôi nằm trong Dữ liệu thư mục con , vì vậy chuỗi kết nối của tôi phải là

metadata = res: // * / Dữ liệu .MyModel.csdl | res: // * / Dữ liệu .MyModel.ssdl | res: // * / Dữ liệu .MyModel.msl;

(so với siêu dữ liệu = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl;).


Đây chính xác là vấn đề của tôi. Mất vài giờ về việc này. Cảm ơn bạn rất nhiều vì lời giải thích dễ dàng này
Fernando Carvalhosa

Câu trả lời tuyệt vời, thực sự giải thích làm thế nào để tìm thấy chuỗi của bạn là gì. Và cho thấy các thư mục con có '.' là dấu phân cách và không phải '\' hoặc '/'.
cjb110

16

Tôi cũng gặp vấn đề này và đó là do chuỗi kết nối trong web.config của tôi hơi khác so với chuỗi trong app.config của hội đồng nơi đặt EDMX của tôi. Không biết tại sao nó lại thay đổi, nhưng đây là hai phiên bản khác nhau.

Ứng dụng.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Điều đã sửa nó chỉ đơn giản là sao chép chuỗi app.config (chú ý sự khác biệt nhỏ ở cuối - thay vì " App=EntityFramework" nó muốn " application name=EntityFramework") vào web.config và vấn đề đã được giải quyết. :)


1
Cảm ơn, đây thực sự là vấn đề của tôi. Tôi đã có 1 dự án truy cập DB với EF và một dự án WCF khác. Sau khi thay đổi tên của dự án đầu tiên, ConnectionString đã được thay đổi trong App.config của dự án đầu tiên của tôi. Vì vậy, tôi đã phải thay đổi kết nốiString trong dự án WCF cũng như trong web.config :)
Volkan

Từ tài liệu MSDN về docs.microsoft.com/en-us/dotnet/framework/data/adonet/ HP : The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.Chuỗi kết nối Entity Framework không chia sẻ tính linh hoạt đó, vì vậy bạn phải chỉ sử dụng các từ khóa mà nó mong đợi.
Suncat2000

13

Điều này đã xảy ra với tôi khi tôi vô tình chuyển Build Action của tệp edmx (xuất hiện dưới Thuộc tính trong IDE) từ 'EntityDeploy' thành 'Không'. EntityDeploy là những gì tạo ra siêu dữ liệu cho bạn: xem http://msdn.microsoft.com/en-us/l Library / cc982037.aspx


Đây là cách khắc phục của tôi - Tôi đã đổi tên edmx của mình thành .old khi tôi sao chép nó và đang thử một vài thứ, sau đó khi tôi đổi tên nó trở lại, Build Action tự đặt thành không và do đó đã gặp lỗi này, đặt lại thành EntityDeploy vấn đề của tôi :)
eth0

Tôi đã chuyển tệp EDMX của mình sang một thư mục khác và phải thay đổi hành động xây dựng để có được các tên tài nguyên nhúng cũng được cập nhật. Cảm ơn!
David

Đây là giải pháp cho tôi; Tôi đã mất cài đặt đó trong quá trình nâng cấp lên .NET Standard. Cảm ơn bạn đã tiết kiệm sự tỉnh táo của tôi!
NetherGranite

11

Điều này xảy ra với tôi khi tôi không làm sạch giải pháp trước khi xây dựng trình thiết kế .edmx mới. Vì vậy, đừng quên làm sạch giải pháp trước khi bạn xây dựng trình thiết kế .edmx mới. Điều này giúp tôi bỏ qua nhiều vấn đề hơn với cái này. Dưới đây là các chi tiết điều hướng được cung cấp trong trường hợp bạn là người mới trong studio hình ảnh.

Nhấp vào-> Xây dựng-> Giải pháp sạch

Sau đó bấm vào-> Xây dựng-> Xây dựng lại giải pháp

Hi vọng điêu nay co ich. Cảm ơn mọi người


8

Tôi vừa trải qua 30 phút hạnh phúc với điều này. Tôi đã đổi tên đối tượng thực thể, đổi tên mục nhập trong tệp cấu hình, nhưng có nhiều hơn ... bạn cũng phải thay đổi tham chiếu đến csdl

rất dễ bỏ lỡ - nếu bạn đổi tên, hãy đảm bảo bạn có mọi thứ ....


6

Tôi đã từng gặp vấn đề tương tự. Tôi nhìn vào dll tuân thủ của tôi với gương phản xạ và thấy rằng tên của tài nguyên không đúng. Tôi đã đổi tên và nó trông ổn bây giờ.


6

Đối với trường hợp của tôi, nó được giải quyết bằng cách thay đổi các thuộc tính của tệp edmx.

  1. Mở tệp edmx
  2. Nhấp chuột phải vào bất kỳ vị trí nào của nhà thiết kế EDMX
  3. chọn thuộc tính
  4. cập nhật Thuộc tính được gọi là "Xử lý tạo dữ liệu siêu dữ liệu" thành "Nhúng vào hội đồng đầu ra"

Điều này giải quyết các vấn đề đối với tôi. Vấn đề là, khi container cố gắng tìm dữ liệu meta, nó không thể tìm thấy nó. vì vậy chỉ cần làm cho nó trong cùng một hội đồng. giải pháp này sẽ không hoạt động nếu bạn có các tệp edmx của mình trong một hội đồng khác


+1.000.000 đây là vấn đề cơ bản đối với tôi ngày hôm nay. Những khó khăn trong việc sắp xếp lại một không gian tên sản phẩm và hợp nhất các tổ hợp.
Mike

6

Tôi đã dành cả một ngày cho lỗi này

nếu bạn đang làm việc với n-tear architecture

hoặc bạn đã cố gắng separate Modelstạo bằng EDMXbiểu mẫu DataAccessLayer đểDomainModelLayer

có thể bạn sẽ gặp lỗi này

  1. Bước khắc phục sự cố đầu tiên là đảm bảo chuỗi Kết nối trong webconfig (UILayer)appconfig (DataAccessLayer)giống nhau
  2. Thứ hai rất quan trọng connection string

    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....

    Đó là vấn đề

từ nơi nào trên trái đất tôi có Modelhoặc bất cứ điều gì .csdl trong chuỗi kết nối của tôi, họ ở đâu

Ở đây tôi giải pháp của chúng tôi nhìn vào hình ảnh

nhập mô tả hình ảnh ở đây

mong các bạn giúp đỡ


5

Tôi đã có thể giải quyết vấn đề này trong Visual Studio 2010, VB.net (ASP.NET) 4.0.

Trong trình hướng dẫn mô hình thực thể, bạn sẽ có thể thấy chuỗi kết nối thực thể. Từ đó bạn có thể sao chép và dán vào chuỗi kết nối của mình.

Thứ duy nhất tôi còn thiếu là "App_Code." trong chuỗi kết nối.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"

Thật không may, chuỗi kết nối trong trình hướng dẫn không chính xác cho app.config. @leqid đề xuất cách tốt để sửa đường dẫn đến mô hình.
Der_Meister

5

Sau nhiều giờ googling và cố gắng giải quyết không có giải pháp nào được đề xuất. Tôi đã liệt kê một số giải pháp ở đây. Tôi cũng đã lưu ý một trong những người làm việc cho tôi. (Tôi đã sử dụng phiên bản EF 6.1.1 và máy chủ SQL 2014 - nhưng DB cũ hơn)

  1. Xây dựng lại dự án và thử lại.
  2. Đóng và mở VS - Tôi không biết cách thức hoạt động của nó
  3. đảm bảo nếu bạn đã đặt tệp .EDMX trong Danh mục, hãy đảm bảo bạn bao gồm các Thư mục trong ConnectionString. ví dụ của tôi là trong thư mục DAL. Vì nó trông như thế này: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(đây là các tệp. Để xem chúng, bạn có thể chuyển đổi Hiển thị tất cả các tệp trong trình khám phá giải pháp, trong thư mục ~ / obj / ..)

... và nhiều thứ nữa mà tôi đã thử [như: hoàn nguyên phiên bản EntityFramework thành phiên bản mới hơn (không chắc chắn về nó)]


những gì đã làm việc cho tôi:

từ bài viết này ở đây , nó đã giúp tôi giải quyết vấn đề của mình. Tôi chỉ thay đổi ProviderManifestToken="2012"thành ProviderManifestToken="2008"trong tệp EDMX. Để làm điều này:

Giải pháp thám hiểm

  1. Nhấp chuột phải vào tập tin .edmx
  2. Mở với..
  3. Trình chỉnh sửa XML
  4. Thay đổi CarrierManifestToken = "XXXX" bằng 2008

Tôi hy vọng điều đó sẽ giúp.


Gần đây tôi đã có vấn đề này sau khi dường như không có thay đổi. Đã thử khởi động lại VS không có kết quả, nhưng sau đó nó đã được sửa bằng cách làm sạch và xây dựng lại. Vì vậy, với những người khác, nếu bạn không thực hiện thay đổi nào và không có phần còn lại nào trong số này có vẻ phù hợp, thì hãy thử làm sạch / xây dựng lại.
Greg

5

Nếu bạn đang sử dụng edmx từ một dự án khác, thì trong chuỗi kết nối, hãy thay đổi ...

metadata=res://*/Data.DataModel.csdl

...đến...

metadata=res://*/DataModel.csdl

Điều này là đúng, nếu bạn muốn di chuyển nó vào thư mục phụ dự án mới của bạn, bạn cần thêm folder.subfoldertrước khi nó.
qakmak

Cảm ơn, giải pháp này đã làm việc cho tôi. Tôi đã chuyển tệp .edmx của mình từ một thư mục trong một dự án, sang thư mục gốc của một dự án khác và cần xóa tên thư mục khỏi tất cả các chuỗi kết nối trong giải pháp của tôi.
Chris

4

Giải pháp cuối cùng (ngay cả sau khi tạo lại cơ sở dữ liệu trên hai máy khác, cũng như EDMX và các đồ lặt vặt khác) là không sử dụng phiên bản đầu tiên của Entity Framework. Nhìn về phía trước để đánh giá nó một lần nữa trong .NET 4.0.

Sau khi gặp lại vấn đề tương tự và tìm kiếm câu trả lời, cuối cùng tôi cũng tìm thấy ai đó có cùng vấn đề. Dường như chuỗi kết nối không được tạo chính xác bởi trình hướng dẫn của Visual Studio và liên kết đến các tài nguyên siêu dữ liệu bị thiếu một đường dẫn quan trọng.

v1.0 BUG?: Không thể tải tài nguyên siêu dữ liệu đã chỉ định. Kịch bản! = Mô hình

Cập nhật 2013-01-16 : Đã chuyển sang sử dụng hầu hết các thực hành Đầu tiên của Mã EF (ngay cả với các cơ sở dữ liệu hiện tại), vấn đề này không còn là vấn đề nữa. Đối với tôi, đó là một giải pháp khả thi để giảm sự lộn xộn từ mã và cấu hình được tạo tự động và tăng quyền kiểm soát của riêng tôi đối với sản phẩm.


4

Vấn đề và giải pháp của tôi, các triệu chứng giống nhau "Không thể tải tài nguyên siêu dữ liệu được chỉ định" nhưng nguyên nhân gốc rễ thì khác. Tôi đã có 2 dự án trong giải pháp một là EntityModel và dự án còn lại là giải pháp. Tôi thực sự đã xóa và tạo lại tệp EDMX trong EntityModel.

Giải pháp là tôi phải quay lại dự án Ứng dụng web và thêm dòng này vào tệp cấu hình. Mô hình mới đã thay đổi một vài mục phải được sao chép trong tệp Web.Config của dự án "khác". Cấu hình cũ không còn tốt nữa.

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

4

Đôi khi tôi thấy lỗi này trong dự án của tôi. Tôi giải quyết nó bằng cách

1 - Nhấp chuột phải vào tệp EDMX

2 - Chọn Run Custom Tooltùy chọn

3 - Dự án xây dựng lại


Điều này làm việc cho tôi nhưng tôi cũng phải xây dựng lại sau đó
rdans

3

Trong trường hợp của tôi, vấn đề này liên quan đến việc đổi tên tệp edmx của mô hình của tôi ... sửa chuỗi kết nối app.config cho các tệp csdl / ssdl / msl đã khắc phục sự cố của tôi.

Nếu bạn đang sử dụng trình thiết kế EF 4.0 để tạo csdl / ssdl / msl, 3 "tệp" này sẽ thực sự được lưu trữ trong tệp edmx chính của mô hình. Trong trường hợp này, bài đăng của Waqas là khá nhiều trên nhãn hiệu. Điều quan trọng là phải hiểu rằng "Model_Name" trong ví dụ của anh ấy sẽ cần được thay đổi thành bất kỳ tên hiện tại nào của tệp .edmx của mô hình của bạn (không có .edmx).

Ngoài ra, nếu tệp edmx của bạn không ở cấp gốc của dự án, bạn cần phải mở đầu Model_Name bằng đường dẫn tương đối, ví dụ:

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

sẽ chỉ định csdl / ssdl / msl xml được lưu trữ trong tệp mô hình 'WidgetModel.edmx' được lưu trữ trong một thư mục có tên 'MyModel'.


3

Tôi đã viết lớp trình trợ giúp này để tạo các thể hiện của các đối tượng ObjectContext khi chúng được định nghĩa trong một dự án khác với dự án sử dụng nó. Tôi phân tích chuỗi kết nối trong tệp cấu hình và thay thế '*' bằng tên lắp ráp đầy đủ.

Nó không hoàn hảo bởi vì nó sử dụng sự phản chiếu để xây dựng đối tượng, nhưng đó là cách làm chung nhất mà tôi có thể tìm thấy.

Hy vọng nó sẽ giúp được ai đó.

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}

3

Đối với tất cả người dùng của bạn SelftrackingEntities, nếu bạn đã theo dõi Microsoft Walk-through và tách lớp ngữ cảnh Object vào dự án dịch vụ wcf (bằng cách liên kết với bối cảnh .tt) thì câu trả lời này là dành cho bạn:

một phần của các câu trả lời được hiển thị trong bài đăng này bao gồm mã như:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

S NOT KHÔNG LÀM VIỆC CHO BẠN !! Lý do là YourObjectContextType.Assemblybây giờ nằm ​​trong một Assembley khác (bên trong tổ hợp dự án wcf),

Vì vậy, bạn nên thay thế YourObjectContextType.Assembly.FullName bằng ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

chúc vui vẻ.


2

Tôi đã có vấn đề với thông báo lỗi tương tự. Vấn đề của tôi đã được giải quyết bằng cách đóng và mở lại Visual Studio 2010.


2

Có vấn đề tương tự vì tôi đã đổi tên một hội đồng.

Tôi cũng đã phải đổi tên nó trong các thuộc tính của AssociationTitle và HộiSản phẩm trong thuộc tính dự án / AssociationInfo.cs, đồng thời xóa và thêm lại tham chiếu vào tệp edmx.

Sau đó, nó hoạt động tốt.


2

Với cùng một vấn đề, tôi đã tạo lại edmx từ Cơ sở dữ liệu. Giải quyết vấn đề của tôi.


2
Thật không may rằng địa chỉ và điều trị các triệu chứng, không phải là nguyên nhân.
Clarice Bouwer

2

Ngoại lệ là do trình biên dịch trỏ đến Siêu dữ liệu không tồn tại nên chỉ cần Sao chép chuỗi app.config kết nối vào Web.configConnectionString


1

Tôi cũng gặp vấn đề và giải pháp tương tự như Rick, ngoại trừ việc tôi đang nhập .edmx hiện có vào một dự án mới, và trong khi không gian tên cơ sở không quan trọng, nó đã được nhập vào một thư mục con khác nên tôi cũng phải cập nhật kết nối chuỗi bên trong Web.Config ở ba nơi, để bao gồm việc đặt tên thư mục con khác nhau:


1

Tôi gặp vấn đề tương tự với một giải pháp chứa các dự án trong Thư mục giải pháp, khi chúng được chuyển đến Root giải pháp (để khắc phục lỗi đáng ngờ với Mvc3AppConverter do vị trí dự án).

Mặc dù giải pháp được biên dịch sau khi tất cả các tham chiếu dự án * được thêm lại khi cần, nhưng lỗi đã được đưa ra khi trang web bị kích hoạt.

EDMX nằm trong một trong những dự án đã được di chuyển (dự án 'Dữ liệu'), nhưng tất nhiên việc thiếu tham chiếu đến dự án Dữ liệu không gây ra lỗi biên dịch, chỉ là lỗi thời gian chạy.

Chỉ cần thêm tham chiếu bị thiếu vào dự án chính đã giải quyết vấn đề này, không cần chỉnh sửa kết nối.

Tôi mong điều này giúp được người nào khác.


1

Đối với tôi, tôi đã tách lớp truy cập dữ liệu và lớp giao diện người dùng. Vì vậy, tôi có chuỗi kết nối thực thể cho mỗi lớp.

Trước khi tôi sửa đổi hai chuỗi kết nối riêng biệt này thành giống nhau, tôi vẫn thấy lỗi bên dưới.

Unable to load the specified metadata resource

Vì vậy, tôi tạo thành các chuỗi kết nối giống nhau cho hai lớp đó (DAL, UI), Nó hoạt động hoàn hảo.

Giải pháp của tôi là làm cho tất cả các chuỗi kết nối giống nhau cho dù chúng đã được trình bày ở đâu .


1

Tôi đã gặp vấn đề này ngày hôm qua và đã xem xét mã của tôi trong gỡ lỗi và đầu ra từ SQL Profiler.

Điều tôi không thể hiểu, trước khi tôi đọc và hiểu bài đăng này, là tại sao EntityFramework lại đưa ra lỗi này khi nó đang gọi DB. Tôi đã xem qua hàng trăm dòng trong SQL Profiler để tìm ra lỗi của mô hình cơ sở dữ liệu. Tôi không thể tìm thấy bất cứ điều gì giống như cuộc gọi mà tôi mong đợi, và thành thật mà nói tôi không chắc chắn những gì tôi đang tìm kiếm.

Nếu bạn ở vị trí này, hãy kiểm tra chuỗi kết nối. Tôi đoán là trước khi EntityFramework tạo SQL của nó, nó sẽ kiểm tra mô hình, được chỉ định trong phần siêu dữ liệu của chuỗi kết nối. Trong trường hợp của tôi, nó đã sai. EntityFramework thậm chí còn không bằng DB.

Hãy chắc chắn rằng tên là chính xác. Khi tôi đã sắp xếp xong, tôi sẽ thấy các cuộc gọi trong SQL Profiler trong đó ApplicationName là 'EntityFramework' với SQL gọi các bảng dự kiến.


1

Một tệp app.config hoặc web.config kém có thể làm điều này .. Tôi đã sao chép chuỗi kết nối app.config vào web.config trong giao diện người dùng của tôi và cuối cùng đã nhập:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.