Kết nối được chỉ định không tìm thấy trong cấu hình, không được sử dụng với nhà cung cấp EntityClient hoặc không hợp lệ


170

Tôi có một đối tượng khung thực thể và khi tôi thêm nó vào dự án của mình, connectionstring nó được thêm vào app.configtrong connectionstringphần, nhưng khi tôi muốn tạo mới entitycontextvà sử dụng cái này connectionstring, lỗi này xuất hiện



4
Cảm ơn vì liên kết, Craig. Tuy nhiên, tôi bỏ phiếu để giữ chủ đề này, vì tiêu đề là thứ giúp tôi tìm ra lỗi MetadataException.
jp2code

Điều này xảy ra với tôi khi tệp cấu hình không cập nhật với chuỗi kết nối vì một lý do lạ.
P.Brian.Mackey

Câu trả lời:


217

Tôi nghi ngờ rằng vấn đề của bạn xuất phát từ thực tế là bạn có nhiều hơn một dự án trong giải pháp của bạn và dự án chứa công cụ khung thực thể của bạn bao gồm edmxcác tệp KHÔNG phải là dự án khởi động của giải pháp. Trong trường hợp này ngay cả khi chuỗi kết nối tồn tại trong app.configdự án EF , CLR vẫn không thể tìm thấy nó khi chạy. Ví dụ: nếu bạn có một trang web và một dự án EF trong giải pháp của mình, bạn cần sao chép chuỗi kết nối từ dự án của EF app.configsang trang web của bạn web.config. Về cơ bản, bất kỳ dữ liệu chuỗi kết nối nào cũng tồn tại trong tệp cấu hình của dự án mà các luồng .Net được khởi tạo bởi CLR (tức là dự án khởi động của bạn). Nếu đây không phải là trường hợp của bạn, thì hãy mởedmxtệp, nhấp chuột phải vào bề mặt của nó, chọn thuộc tính và sao chép chuỗi kết nối và dán nó vào app.configphần Chuỗi kết nối của bạn . Bằng cách này, bạn có thể chắc chắn rằng bạn đang có một cái đúng trong cấu hình của bạn.

EDIT:
Như bạn có thể thấy ở đây trên Documation trên ObjectContext Con constructor , tham số đầu tiên là tên chuỗi kết nối là mã được tạo tại thời điểm bạn tạo EDM. Nếu, bằng cách nào đó, tên của tên chuỗi kết nối của bạn tình cờ bị thay đổi, tất cả những gì bạn cần làm là nhấp chuột phải vào mô hình của bạn và chọn "Cập nhật mô hình từ cơ sở dữ liệu ...", sau đó làm theo trình hướng dẫn để cập nhật confing và designer của bạn để phản ánh điều này thay đổi.


1
xin chào Morteza và cảm ơn câu trả lời của bạn, nhưng trước đây tôi đã sao chép sectin chuỗi kết nối trong web.config, nhưng lỗi không được khắc phục, nhưng khi trong entitymodel.designer thay thế (công khai EntityContext (): base ("name = EntityContext", EntityContext " )) whit chuỗi kết nối này hoạt động, bất kỳ idae
user421413

1
@Morteza, bạn có giải pháp nào cho các dự án trong đó phần thực thi không có app.config không? Trong trường hợp của tôi, cuộc gọi thực thi là một ứng dụng VB6 gọi hội đồng của tôi (nơi có các đối tượng thực thể) thông qua COM Interop.
Dave dễ hỏng

4
quá đơn giản, nhưng thật bực bội Lên BẦU. Stackoverflow sống lâu!
granadaCoder

3
Nếu bạn đang sử dụng WCF, hãy nhớ bao gồm chuỗi kết nối trong dự án dịch vụ của bạn
Nathan

1
Cảm ơn Morteza, đã tiết kiệm cho tôi nhiều thời gian!
Chris

32

Bạn cần sao chép chuỗi kết nối trong app.config vào web.config hoặc sao chép toàn bộ tệp vào dự án hiển thị đầu ra. Đây là một trong những điều kiện để tiêu thụ khuôn khổ.


1
chỉ cần thêm chuỗi kết nối tương tự (như trong dự án truy cập dữ liệu) trong web.config của bạn (được tìm thấy trong dự án giao diện người dùng).
Đan Mạch

@ Musikero31 Tôi sử dụng EF và xác định tất cả các chuỗi kết nối thực thể trong mã. Tôi không có bất cứ điều gì trong một cấu hình liên quan đến nó.
Keith Beard

Sau khi tôi sao chép các tệp DAL vào một dự án mới, tôi cũng đã nhận được lỗi trên. Nhìn kỹ hơn vào các tập tin cấu hình, tôi nhận thấy rằng chuỗi kết nối đã được thay thế bởi EF. Tôi đã có thể tự sao chép / dán chuỗi kết nối chính xác vào dự án mới và nó đã hoạt động.
Ravi Ram

9

Tôi gặp vấn đề này khi tôi cố gắng đưa logic cơ sở dữ liệu tùy chỉnh của mình vào một tệp được sử dụng bởi nhiều dự án trong giải pháp của tôi.

Mặc dù các tệp có tệp app.config chính xác, nhưng nó không hoạt động. Các khung thực thể muốn thông tin kết nối trong app.config của .exe. Sao chép thông tin vào đó chỉ hoạt động tốt.

Giải pháp của Morteza là dán chuỗi kết nối trực tiếp vào .edmx không hiệu quả với tôi, vì nó sẽ không cho phép tôi dán giá trị vào đó - mặc dù đó chính xác là những gì tôi muốn làm.


3
Mặc dù chỉ có một app.config (và đó là tệp cấu hình duy nhất trong thư mục đó) trong thư mục exe của tôi nhưng nó sẽ không đọc được. Tôi đã phải đổi tên tệp myExe.exe.config
Mario

6

Xin chào tôi đã có vấn đề này và nó đã làm cho tôi dở hơi. Dù sao cuối cùng tôi cũng đã tìm ra vấn đề. Điều đầu tiên bạn phải làm là đảm bảo rằng connectionstringstrong app.configweb.configgiống nhau. Sau đó, bạn phải nhấp đúp chuột vào .edmxtập tin để bạn có thể xem các bảng. Khi bạn nhấp vào bất cứ nơi nào gần các bảng nhưng không phải trên các bảng và đi đến các thuộc tính. Từ danh sách thả xuống, chọn ConceptualEntityModelvà tìm kiếm Tên thực thể và ghi nhớ nó.

Tiếp theo, đi đến người thiết kế tệp edmx và mở các hàm tạo. (người thiết kế là thư mục con của tệp edmx) các hàm tạo nên có hai tham số trong tham số BASE

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

Đây là một trong số họ. tham số đầu tiên phải có tên của tệp dự án chứa .edmxtệp. Tham số thứ hai phải có tên của tên thùng chứa thực thể từ các thuộc tính tôi đã đề cập trước đó. đừng quên sắp xếp tất cả các hàm tạo với:base("", "")

Đó là vấn đề của tôi và vấn đề của tôi đã được giải quyết như thế. Tôi hy vọng bạn quản lý để giải quyết của bạn như thế này.


6

Tôi đã có một biến thể về điều này mà dường như không ai có thể bao quát.

Tôi đã có một dự án chính với một vài mô hình và Dự án thử nghiệm chứa các bài kiểm tra đơn vị. Dự án thử nghiệm đã hoạt động, nhưng sau đó dừng lại với lỗi được đề cập trong OP. Tôi đã không thực hiện bất kỳ việc đổi tên hoặc di chuyển tệp EDMX.

Rất nhiều lời khuyên đề cập đến việc so sánh các tệp .config, nhưng dự án của tôi không có gì cả.

Cuối cùng, tôi đã sao chép tệp app.config từ dự án chính vào dự án thử nghiệm của mình và sau đó nó hoạt động. Cho dù đây là bước chính xác hay sẽ trình bày các vấn đề về khả năng bảo trì khi các mô hình bổ sung được thêm vào, tôi không biết, nhưng ít nhất các bài kiểm tra đơn vị của tôi đang chạy lại chính xác.


Kể từ khi tôi đăng bài này, tôi nhận ra rằng có lẽ tốt nhất là tạo một liên kết đến tệp app.config của một dự án khác. Tuy nhiên, cách tiếp cận khác sẽ hoạt động để khắc phục sự cố ban đầu khi không có tệp cấu hình nào cả.
S. Baggy

4

Mặc dù câu trả lời của Morteza Manavi không giải quyết được vấn đề này, một giải pháp khác là xây dựng chuỗi kết nối một cách linh hoạt và chuyển nó vào hàm tạo cho ObjectContext của bạn:

public static string CreateConnectionString()
{
    var assemblyPath = Assembly.GetExecutingAssembly().Location;
    string assemblyLocation = Path.GetDirectoryName(assemblyPath);
    string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
    var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };

    var entityBuilder = new EntityConnectionStringBuilder
    {
        ProviderConnectionString = sqlBuilder.ConnectionString,
        Provider = "System.Data.SqlServerCe.3.5",
        Metadata = @"res://*/YourModel.csdl|
                 res://*/YourModel.ssdl|
                 res://*/YourModel.msl"
    };

    return entityBuilder.ToString();
}

// Snip...

var entityContext = new YourObjectContext(CreateConnectionString());

Điều này giúp loại bỏ sự cần thiết phải sao chép thông tin chuỗi kết nối vào app.config của dự án khởi động của bạn, điều mà ít nhất là trong trường hợp của tôi, là không mong muốn.


4

Tôi đã quên thêm CarrierName = "System.Data.EntityClient" làm thuộc tính trong chuỗi kết nối. Điều này dẫn đến lỗi này vì vậy

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

thay vì

<add name="connectionName" connectionString="metadata=res://*/..." />

2

Tôi chỉ thấy rằng nếu một ứng dụng được tạo trong IIS từ VS2010, hai cấp độ từ trang web gốc thì lỗi này sẽ xảy ra. Không chắc chắn tại sao nó xảy ra, sẽ cần phải điều tra thêm. Ví dụ: nếu ứng dụng của bạn nằm trong đường dẫn này: /admin/advertiserlỗi sẽ xuất hiện nếu bạn không có /adminthư mục ảo trong trang IIS của mình.

Tất cả tôi đã làm là tạo một adminthư mục trống trong .../intepub/wwwrootlỗi của tôi biến mất.

Bạn sẽ thấy rằng bạn sẽ không thể bắt đầu gỡ lỗi cho đến khi bạn thực hiện bước trên.

Chúng tôi đã có vấn đề này trong nhóm của chúng tôi trong quá khứ, phải mất một thời gian để nhớ nhưng đây chính xác là cách chúng tôi đã sửa nó trước đây.


1

Tôi đang sử dụng kiến ​​trúc n'tier và gặp vấn đề tương tự nhưng điều này giúp tôi. Hy vọng điều này sẽ giúp bạn. Trước tiên, bạn phải cùng connection stringvào bạn libraries, nơi bạn có thể truy cập vào DB như trong app.configweb.config sau đó bạn chỉ cần thêm một quá tải constructor trong .edmx file (Model.context.cs) mà bây giờ bạn có hai constructor một là mặc định và một trong những khác u chỉ gia tăng ( quá tải).

        public YourEntityName(string connString)
            : base(connString)
        {
        }

1

Tôi cũng có một thư viện lớp không muốn làm việc với EF. Sau khi tôi sao chép app.config (hoặc chỉ phần kết nối) từ thư viện lớp của tôi sang dự án exe, kết nối đã hoạt động tốt! Có lẽ tệp cấu hình dự kiến ​​sẽ nằm trong cùng thư mục với dự án exe và do đó không được tìm thấy. Vì vậy, luôn luôn cẩn thận khi một tệp cấu hình được sử dụng trong một dự án thư viện lớp!


0

Chà ... vấn đề này cũng có thể vì một lý do rất đơn giản (ngu ngốc) ... Tôi đã sao chép một tệp từ một dự án khác và quên thay đổi ConnectionString trên EntityDataSource ... khi tôi bắt đầu dự án và đã xảy ra trong trang đăng nhập, tôi nghĩ rằng đó là một cái gì đó trên cấu hình, nhưng chỉ là tên chuỗi kết nối sai (và DefaultContainerName).

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.