Không tìm thấy chuỗi kết nối có tên 'MyEntities' trong tệp cấu hình ứng dụng


246

Tôi đang sử dụng khung thực thể và ASP.NET MVC 4 để xây dựng một ứng dụng

Giải pháp của tôi được chia thành hai dự án;

  • Một thư viện lớp bao gồm tệp mô hình dữ liệu của tôi (.edmx) và một vài giao diện tùy chỉnh
  • Dự án MVC 'container' tham chiếu thư viện lớp ở trên

Vấn đề của tôi là khi tôi cố gắng sử dụng DbContext của ' MyEntites ', tôi gặp phải lỗi sau:

Không tìm thấy chuỗi kết nối có tên 'MyEntities' trong tệp cấu hình ứng dụng.

Tôi đoán vấn đề có liên quan đến thực tế là chuỗi kết nối nằm trong app.config của thư viện lớp chứ không phải dự án MVC.

Có ai có bất cứ đề nghị?


15
Không hoàn toàn giống với bối cảnh của bạn (di chuyển tự động với EF6) nhưng tôi gặp vấn đề tương tự với thông báo lỗi tương tự khi tôi tạo một nhánh con trên TFS và bắt đầu làm việc với nó. Đánh dấu dự án mvc là dự án khởi nghiệp đã giải quyết điều này. đầu ra PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
Vật thể cơ khí

Câu trả lời:


309

Hãy thử sao chép chuỗi kết nối vào tệp .config trong dự án MVC.


63
Hoạt động hoàn hảo nhưng rất muốn biết lý do tại sao dự án được tham chiếu không sử dụng tệp cấu hình riêng của nó để tìm nạp chuỗi kết nối.
Null Head

7
@Alexander Câu hỏi cũ nhưng có, tôi cũng muốn biết tại sao.
Kehlan Krumme

22
@Alexander, khung tải và sử dụng (các) tệp cấu hình để lắp ráp thực thi. Trong trường hợp này, đó là dự án web. Các thư viện lớp thường không có tệp cấu hình riêng.
kiprainey

24
Các lệnh Kích hoạt di chuyển khi chạy trong ngữ cảnh NuGet COnsole, xem tệp cấu hình Khởi động dự án, không nhất thiết là dự án mà bạn nghĩ sẽ có. Chỉ cần đặt dự án với app.config bạn muốn là người khởi động dự án. Tùy chọn, Lưu trữ chuỗi kết nối của bạn trong một tệp cấu hình, sau đó tham chiếu chúng trong các dự án khác bằng <ConnectionString configSource = "../ ProjectDir / SharedConnections.config" />
Ryan Mann

3
Tôi đã nhận được thông báo lỗi chính xác này, nhưng tệp .config của tôi - trong dự án đúng - thực sự đã liệt kê chuỗi kết nối chính xác. Tuy nhiên, tôi đã sử dụng các phép biến đổi và chuỗi kết nối tất nhiên không được tham chiếu trong tệp .config đã chuyển đổi. Vì vậy, đó là điều cần chú ý, nếu bạn đang sử dụng các chuyển đổi tệp cấu hình.
Morten Nørgaard

143

Bạn đã đúng, điều này xảy ra vì thư viện lớp (nơi tệp .edmx) không phải là dự án khởi động / chính của bạn.

Bạn sẽ cần sao chép chuỗi kết nối vào tệp cấu hình dự án chính.

Trong trường hợp khởi động / dự án chính của bạn không có tệp cấu hình (giống như trong trường hợp Ứng dụng Console của tôi) chỉ cần thêm một (Dự án khởi động - Thêm mục mới -> Tệp cấu hình ứng dụng).

Thông tin liên quan khác có thể được tìm thấy ở đây: MetadataException: Không thể tải tài nguyên siêu dữ liệu được chỉ định


8
Câu trả lời chính cho điều này là thư viện lớp (nơi chứa tệp .edmx) không phải là dự án STARTUP của bạn. Tôi nhận ra rằng dự án khởi động của tôi không được đặt thành dự án có web.config của tôi. Đó là một ứng dụng bảng điều khiển có ứng dụng khác. Vì vậy, nếu bạn đang thêm các ứng dụng bảng điều khiển vào giải pháp web của mình, hãy đảm bảo dự án web của bạn là dự án khởi động khi bạn chạy cơ sở dữ liệu cập nhật!
Karl

1
Tôi đã dỡ dự án chính của mình vì một số lý do và sau khi tải lại, tôi gặp lỗi này khi cố gắng thêm di chuyển. Làm cho dự án khởi động dự án chính một lần nữa giải quyết vấn đề. Cảm ơn @Oren
Azadrum

2
Dự án khởi nghiệp của tôi đã bị thay đổi do nhầm lẫn. Đó là bit chính. Câu trả lời của bạn thực sự có ích!
Fabio Milheiro

98

đảm bảo rằng bạn thực hiện dự án của mình (với DbContext) khi khởi động

vào dự án nhấp chuột phải và chọn

HOẶC LÀ

Thêm vào dự án được đặt là khởi động chuỗi kết nối của bạn trong app.config (hoặc web.config)

HOẶC LÀ

Gọi lệnh như thế này

Update-Database -Script -ProjectName '<project name>' -StartupProjectName '<project name>' -ConnectionString 'data source=.;initial catalog=<db name>;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'

Sau đó thử lại


2
Thực tế, dự án chứa chuỗi kết nối nên được đặt thành dự án khởi động và thông thường đó không phải là dự án mà tệp DbContext của bạn nằm
Raymond Wang

1
... do đó, ngoài việc đảm bảo Gói Mgr nhắm đúng lớp, lớp đó cũng cần phải Set as Startup Projectnhư vậy - theo ảnh chụp màn hình ở trên. (ngay cả khi bạn đạt F5, bạn sẽ không thể bắt đầu thư viện lớp)
bkwdesign

3
Điều này đã cứu cuộc đời tôi. Mặc dù trong Trình quản lý gói tôi đã đặt Dự án mặc định thành dự án nơi bối cảnh được đặt, nó vẫn không ghi đè.
garfbradaz

1
"Nhưng nó đã làm việc ngày hôm qua! Lệnh chính xác tương tự !" => NÀY!
Simon_Weaver

1
Cách dễ nhất =)
Alexandr

29

Bạn chỉ có thể truyền chuỗi kết nối đến EntityFrameworkvà tiếp tục cuộc sống của mình:

public partial class UtilityContext : DbContext
{
    static UtilityContext()
    {
        Database.SetInitializer<UtilityContext>(null);
    }

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    {
    }

    // DbSet, OnModelCreating, etc...
}

và làm cho ngày của tôi cũng vì tôi không thể tìm ra giải pháp cho lý do tại sao dự án khởi động của tôi đột nhiên ngừng tìm tệp cấu hình. App.config và <appname> .exe.config của tôi đã hiển thị trong thùng dự án khởi động của tôi và EntityFramework không thể tìm thấy chuỗi kết nối mà tôi đã sử dụng mãi mãi. Tôi đã loại bỏ một số dự án không sử dụng gần đây khỏi giải pháp và tôi tự hỏi liệu điều đó có liên quan gì đến nó không. Tôi đã loại bỏ một dự án web từ giải pháp. Tự hỏi nếu các dự án khác của tôi đang dựa vào web.config hoặc một cái gì đó bất thường như thế.
GrayDwarf

Cấu hình của dự án đang chạy được sử dụng bởi tất cả các dự án con khác.
Serj Sagan

1
Nhưng làm thế nào để đặt tên nhà cung cấp?
FizxMike

9

Khi bạn phỏng đoán, đó là việc thực hiện với chuỗi kết nối nằm trong app.config của thư viện lớp.

Sao chép mục nhập từ lớp app.config sang tệp app.confighoặc web.configtệp chứa


8

Nếu bạn có nhiều dự án trong giải pháp, thì hãy thiết lập dự án khởi động khi bạn có App.config thật.


7

sao chép chuỗi kết nối vào app.confighoặc web.configtệp trong dự án đã được đặt thành "Đặt làm StartUpdự án" và trong trường hợp sử dụng khung thực thể trong dự án lớp dữ liệu - vui lòng cài đặt nuget khung thực thể trong dự án chính.


4

Nó cũng sẽ xảy ra nếu các dự án khởi động được thay đổi với một, mà khôngdây kết nối .

  1. Giải pháp nhấp chuột phải - thuộc tính nhấp chuột
  2. Trong Thuộc tính chung, chọn dự án khởi động
  3. Trên khung bên phải chọn dự án có chuỗi kết nối (trong hầu hết các trường hợp, đó sẽ là dự án MVC - dự án bắt đầu giải pháp)

Có nó hoạt động. Tôi đã tạo một thư viện lớp cho EF để liên lạc với DB và gặp vấn đề tương tự.
Satinder Sidhu

4
  1. Thêm tệp App.Config
  2. Đặt dự án là dự án khởi động.
  3. Đảm bảo bạn thêm các chuỗi kết nối sau entityFrameworkphần:

    <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>

3

Vâng, thật ngớ ngẩn. Bạn có thể tránh sao chép chuỗi kết nối bằng cách sử dụng trình tạo kết nối. Mã VB.Net (được sử dụng trong sản xuất, nhưng được sửa đổi một chút ở đây, vì vậy hãy coi như chưa được kiểm tra, sẵn sàng hỗ trợ mọi vấn đề), trong đó tôi có biến serverName, biến cơ sở dữ liệu, tôi chuyển chúng vào một phương thức và tạo ra kết nối cho tôi:

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)

2

bạn đang sử dụng nhiều hơn một dự án trên giải pháp của bạn?

Bởi vì nếu là bạn, cấu hình web bạn phải kiểm tra là cấu hình trên cùng một dự án với tệp de .edmx


Vâng, đây là trường hợp. Dự án chứa chuỗi kết nối là một thư viện lớp chỉ bao gồm tệp App.config. Dự án MVC dường như không kiểm tra tho.
jjc99

trong quá trình phát triển, nó sẽ chỉ cập nhật app.config trong dự án của nó, bạn phải thêm vào đó
Diego

Cảm ơn bạn đã trả lời. Tôi đã thử sao chép chuỗi kết nối từ dự án chứa tệp edmx và đặt nó vào tệp web.config gốc trong dự án MVC của tôi. Thật không may, nó vẫn không thể tìm thấy chuỗi kết nối. Tôi có phải sửa đổi chuỗi kết nối theo bất kỳ cách nào không?
jjc99

cách khác của nó xung quanh. Trong thời gian dev bạn cần chuỗi con trên app.cofnig trên Project có tệp .edmx. Nếu bạn có nó có thể tên là sai. Tên của chuỗi kết nối phải cùng tên với thuộc tính "tên chứa thực thể" của tệp .edmx của bạn
Diego

1

Thêm ConnectionString vào tệp Dự án Web.config của MVC


1

Tôi đã gặp vấn đề này khi tôi sử dụng nhiều proyect, proyect bắt đầu với web.config và app.config cho dự án EntityFramework.

Để tránh vấn đề này, bạn phải:

  1. Bạn cần chuỗi kết nối trong tệp * .config đã bắt đầu.
  2. Bạn cần cài đặt DLL EntityFramework vào tài liệu tham khảo của mình

1

Tôi đã phải đối mặt với cùng một vấn đề. Tôi đã bỏ lỡ việc đưa chuỗi kết nối vào dự án khởi động khi tôi đang thực hiện thao tác truy cập dữ liệu từ lớp khác. ngoài ra nếu bạn không có app.config trong dự án khởi động thì hãy thêm tệp app.config rồi thêm chuỗi kết nối vào tệp cấu hình đó.


1
Cảm ơn, tôi đã gặp sự cố với tải dự án của mình và nó bị mất "Dự án khởi động". Câu trả lời của bạn đã nhắc nhở tôi để đảm bảo dự án có tệp Ngữ cảnh và app.config là Khởi động.
Mastro

1

Tôi đã nhận được điều này bằng cách không đặt dự án là khởi động, như được chỉ ra bởi một câu trả lời khác. Đóng góp của tôi cho việc này - khi thực hiện Thêm di chuyển và Cập nhật cơ sở dữ liệu, chỉ định dự án khởi động là một phần của lệnh trong Bảng điều khiển trình quản lý gói Nuget (không bao gồm các ký tự '[' hoặc ']', chỉ để cho bạn thấy rằng bạn cần thay đổi văn bản nằm ở đó thành tên dự án của bạn):

  1. Cho phép di chuyển
  2. Thêm di chuyển -StartupProject [tên dự án của bạn có chứa lớp ngữ cảnh dữ liệu]
  3. Cập nhật-Cơ sở dữ liệu -StartupProject [cùng tên dự án như trên]

Nên làm vậy.


Bằng cách này, bạn có thể bao gồm các lệnh trong quy trình của mình và không phải liên tục thay đổi dự án khởi động khỏi mặc định.
JakeJ

1

Đó là bởi vì lớp ngữ cảnh của bạn đang được kế thừa từ DbContext. Tôi đoán ctor của bạn là như thế này:

public MyEntities()
    : base("name=MyEntities")

name=... nên được đổi thành tên ConnectionString của bạn


0

Chuỗi kết nối được tạo bởi dự án chứa tệp .edmx tạo ra chuỗi kết nối, đây có vẻ là một phần lưu giữ từ các loại tệp app.config được sao chép vào thư mục đầu ra và được tham chiếu bởi tệp thực thi để lưu trữ thông tin cấu hình thời gian chạy.

Điều này phá vỡ trong dự án web vì không có quy trình tự động để thêm thông tin .config ngẫu nhiên vào tệp web.config cho dự án web.

Dễ nhất là sao chép chuỗi kết nối từ tệp cấu hình sang phần kết nối của tệp web.config và bỏ qua nội dung tệp cấu hình.


0

Cách tốt nhất tôi vừa tìm thấy để giải quyết vấn đề này là tạm thời đặt dự án đó (rất có thể là một thư viện lớp) cho dự án khởi động. Điều này buộc bảng điều khiển quản lý gói sử dụng dự án đó làm nguồn cấu hình. một phần lý do nó được thiết lập theo cách này là do mô hình từ trên xuống mà các tệp econfig thường tuân theo. Nguyên tắc chung là dự án gần máy khách nhất (ví dụ ứng dụng MVC) là web.config hoặc app.config sẽ được sử dụng.


0

Đảm bảo bạn đã đặt chuỗi kết nối trong ROOT web.config của dự án khởi động.

Tôi biết tôi đang nói rõ điều này ở đây, nhưng nó cũng xảy ra với tôi - mặc dù tôi đã HAD chuỗi kết nối trong Web.Config của dự án MVC của tôi (tệp .edmx được đặt tại một dự án thư viện lớp khác) và tôi không thể Tôi không hiểu tại sao tôi cứ bị ngoại lệ ... Câu chuyện dài, tôi đã sao chép chuỗi kết nối vào Views \ Web.Config do nhầm lẫn, trong một sự kết hợp kỳ lạ của sự mệt mỏi và không di chuyển từ dưới lên kịch bản-giải pháp-thám hiểm. Vâng, những điều này cũng xảy ra với các nhà phát triển kỳ cựu :)


0

Sự cố này xảy ra khi bạn đang sử dụng Lớp trong Dự án của mình và đã xác định hoặc cài đặt khung Thực thể hoạt động trong DataLayer và cố gắng chạy Dự án của bạn

Vì vậy, để khắc phục vấn đề này, sao chép chuỗi kết nối từ lớp có tệp Edmx ở đó và dán chuỗi kết nối trong web.config chính.


0

Thêm một chuỗi kết nối trong tệp web.config gốc của dự án MVC 'container' tham chiếu thư viện lớp như sau:

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

Nếu bạn không muốn sử dụng "MyEntities" làm tên kết nối thì hãy thay đổi nó theo ý muốn nhưng thực hiện thay đổi sau trong lớp MyEntities DbContext của bạn:

MyEntities: DbContext
 {
   public MyEntities():base("Name-Of-connection-string-you wish to connect"){ }
 }

Lý do cho lỗi này là, Nếu chúng tôi sẽ không chỉ định tên của chuỗi kết nối Hoặc chuỗi kết nối trong lớp dẫn xuất của DbConext (Trong trường hợp của bạn là MyEntities) thì DbContext sẽ tự động tìm kiếm một chuỗi kết nối trong tệp web.config tên người là giống như tên lớp dẫn xuất (Trong trường hợp của bạn, đó là Thực thể của tôi).


0

Tôi gặp vấn đề này khi chạy MSTest. Tôi không thể làm cho nó hoạt động mà không có cờ "ồn ào".

Hy vọng điều này sẽ giúp được ai đó. Chi phí cho tôi rất nhiều thời gian để tìm ra điều đó. Mọi thứ đều chạy tốt từ IDE. Một cái gì đó kỳ lạ về Entity Framework trong bối cảnh này.


0

Di cư thường xuyên

Có hai tùy chọn - lựa chọn đầu tiên mà mọi người ở đây đã đề xuất là đảm bảo rằng chuỗi kết nối nằm trong tệp Web.config của dự án. Khi làm việc với các chuỗi kết nối từ cài đặt ứng dụng Azure, điều đó có nghĩa là ghi đè các giá trị Web.config của bạn bằng các giá trị Azure.

Azure hoặc di chuyển tự động (lập trình)

Có sẵn tùy chọn thứ hai nếu bạn đang chạy di chuyển theo chương trình, cho phép bạn chạy di chuyển bằng chuỗi kết nối thu được một cách linh hoạt (hoặc thông qua cài đặt ứng dụng Azure) mà không lưu trữ trong Web.config:

Khi đặt TargetDatabase của cấu hình , hãy sử dụng hàm tạo DbConnectionInfo lấy chuỗi kết nối và tên nhà cung cấp thay vì hàm tạo chỉ lấy tên kết nối. Nếu chuỗi kết nối của bạn không có tên nhà cung cấp và bạn đang sử dụng SQL Server / Azure SQL thì hãy sử dụng "System.Data.SqlClient"


0

Điều này cũng có thể dẫn đến không đủ các tham chiếu dll được tham chiếu trong mã gọi. Một hack vụng về nhỏ có thể tiết kiệm ngày của bạn.

Tôi đã theo cách tiếp cận DB First và đã tạo tệp EDMX trong dự án thư viện DAL Class và điều này có liên quan đến thư viện BAL Class, do đó được tham chiếu bởi dịch vụ WCF.

Vì tôi gặp lỗi này trong BAL, tôi đã thử phương pháp được đề cập ở trên để sao chép chi tiết cấu hình từ App.config của dự án DAL, nhưng không giải quyết được. Cuối cùng với lời khuyên của một người bạn tôi vừa thêm một tệp EDMX giả vào dự án WCF (với Kết nối DB có liên quan, v.v.), vì vậy nó đã nhập mọi thứ cần thiết, và sau đó tôi đã xóa tệp EDMX, và nó đã thoát khỏi vấn đề với một tòa nhà sạch sẽ.


0

Có một nhận xét về câu trả lời hàng đầu của @RyanMann cho thấy:

Lưu trữ chuỗi kết nối của bạn trong một tệp cấu hình, sau đó tham chiếu chúng trong các dự án khác bằng cách <connectionString configSource="../ProjectDir/SharedConnections.config" />

Đây là một gợi ý tuyệt vời!

Nó cũng hoạt động để chia sẻ chuỗi kết nối giữa các tệp App.config và Web.config!

Bất cứ ai muốn làm theo gợi ý này, nên tìm đến câu trả lời SO này . Nó có một hướng dẫn từng bước thực sự tuyệt vời về việc chia sẻ chuỗi kết nối giữa nhiều dự án trong một giải pháp.

Thông báo trước duy nhất là configSourcephải tồn tại trong cùng thư mục hoặc thư mục con. Liên kết ở trên giải thích cách sử dụng "Thêm dưới dạng liên kết" để giải quyết vấn đề này.


0

Tôi đã gặp lỗi này khi cố gắng sử dụng EF trong plugin AutoCAD. Các plugin CAD lấy chuỗi kết nối từ tệp acad.exe.config. Thêm chuỗi kết nối như đã đề cập ở trên vào tập tin cấu hình acad và nó hoạt động.

Tín dụng đến Norman.Yuan từ ADN.Network.


0

Nếu bạn đang sử dụng mô hình MVVM, hãy thử sao chép chuỗi kết nối vào tất cả các phần trong dự án của bạn.

Ví dụ: nếu giải pháp của bạn chứa hai dự án, dự án thư viện lớp và dự án wpf, bạn phải sao chép chuỗi kết nối của dự án phụ trợ (porject lớp thư viện) và đặt một bản sao trong tệp App.config của dự án wpf.

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

Hy vọng nó hữu ích cho bạn :)


-2

Thêm Connectoinstrnig trong tệp web.config

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
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.