Tidak ada string koneksi bernama 'MyEntities' yang dapat ditemukan di file konfigurasi aplikasi


246

Saya menggunakan kerangka kerja entitas dan ASP.NET MVC 4 untuk membangun aplikasi

Solusi saya dibagi menjadi dua proyek;

  • Pustaka kelas yang menyertakan file model data (.edmx) saya dan beberapa antarmuka khusus
  • Proyek MVC 'container' yang merujuk pustaka kelas di atas

Masalah saya adalah ketika saya mencoba menggunakan DbContext ' MyEntites ' saya mendapatkan kesalahan berikut:

Tidak ada string koneksi bernama 'MyEntities' yang dapat ditemukan di file konfigurasi aplikasi.

Saya kira masalahnya ada hubungannya dengan fakta bahwa string koneksi terletak di app.config dari pustaka kelas daripada proyek MVC.

Adakah yang punya saran?


15
Tidak persis konteks yang sama seperti milik Anda (migrasi otomatis dengan EF6) tetapi saya memiliki masalah yang sama dengan pesan kesalahan yang sama ketika saya membuat cabang anak di TFS dan mulai bekerja di sana. Menandai proyek MVC sebagai proyek start-up menyelesaikan ini. output 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).
Obyek Mekanik

Jawaban:


309

Coba salin string koneksi ke file .config di proyek MVC.


63
Bekerja dengan sempurna tetapi ingin tahu mengapa proyek yang direferensikan tidak menggunakan file konfigurasi sendiri untuk mengambil string koneksi.
Null Head

7
@Alexander Pertanyaan lama tapi ya, saya juga ingin tahu mengapa.
Kehlan Krumme

22
@Alexander, kerangka memuat dan menggunakan file konfigurasi untuk perakitan yang mengeksekusi. Dalam hal ini, ini adalah proyek web. Pustaka kelas umumnya tidak memiliki file konfigurasi sendiri.
kiprainey

24
Perintah Enable-Migration ketika dijalankan dalam konteks NuGet COnsole, melihat pada file konfigurasi Startup Projects, belum tentu proyek yang Anda pikir akan masuk. Cukup tetapkan proyek dengan app.config yang Anda inginkan sebagai startup. proyek. Secara opsional, Simpan string koneksi Anda dalam satu file konfigurasi, kemudian rujuk di proyek lain dengan <connectionString configSource = "../ ProjectDir / SharedConnections.config" />
Ryan Mann

3
Saya mendapat pesan kesalahan ini, tetapi file .config saya - dalam proyek yang tepat - memang mencantumkan string-koneksi yang benar. Namun, saya menggunakan transformasi, dan koneksi-string tentu saja tidak direferensikan dalam file .config yang diubah. Jadi itu sesuatu yang harus diwaspadai, jika Anda menggunakan transformasi file konfigurasi.
Morten Nørgaard

143

Anda benar, ini terjadi karena perpustakaan kelas (di mana file .edmx) bukan startup / proyek utama Anda.

Anda harus menyalin string koneksi ke file konfigurasi proyek utama.

Jika Anda memulai / proyek utama tidak memiliki file konfigurasi (seperti itu dalam kasus Aplikasi Konsol saya) cukup tambahkan satu (proyek Startup - Tambah Item Baru -> File Konfigurasi Aplikasi).

Informasi lebih relevan dapat ditemukan di sini: MetadataException: Tidak dapat memuat sumber daya metadata yang ditentukan


8
Jawaban kunci untuk ini adalah bahwa perpustakaan kelas (di mana file .edmx berada) bukan proyek STARTUP Anda. Saya menyadari bahwa proyek startup saya tidak diatur ke proyek yang memiliki web.config saya. Itu adalah aplikasi konsol dengan app.config yang berbeda. Jadi jika Anda menambahkan aplikasi konsol ke solusi web Anda, pastikan proyek web Anda adalah proyek startup ketika Anda menjalankan pembaruan-database!
Karl

1
Saya telah membongkar proyek utama saya untuk beberapa alasan dan setelah memuatnya kembali saya mendapatkan kesalahan ini dengan mencoba menambahkan migrasi. Membuat proyek startup proyek utama lagi memecahkan masalah. Terima kasih @ Oren
Azadrum

2
Proyek startup saya telah diubah karena kesalahan. Itulah kuncinya. Jawaban Anda sangat membantu!
Fabio Milheiro

98

pastikan bahwa Anda menjadikan proyek Anda (dengan DbContext) sebagai startup

pada proyek klik kanan dan pilih

ATAU

Tambahkan ke proyek yang ditetapkan sebagai startup string koneksi Anda di app.config (atau web.config)

ATAU

Panggil perintah seperti ini

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'

Lalu coba lagi


2
Sebenarnya proyek ini berisi string koneksi yang harus ditetapkan sebagai proyek startup, dan biasanya bukan proyek tempat file DbContext Anda berada
Raymond Wang

1
... dengan demikian, selain memastikan Paket Mgr menargetkan lapisan yang tepat, lapisan yang sama harus Set as Startup Project- sesuai tangkapan layar yang ditunjukkan di atas. (walaupun jika Anda menekan F5, Anda tidak akan dapat memulai perpustakaan kelas)
bkwdesign

3
Ini menyelamatkan hidupku. Meskipun di Package Manager saya telah menetapkan Default Project ke proyek di mana konteksnya ditetapkan, itu masih tidak menimpa.
garfbradaz

1
"Tapi itu berhasil kemarin! Perintah yang sama persis !" => INI!
Simon_Weaver

1
Cara termudah =)
Alexandr

29

Anda bisa meneruskan string koneksi ke EntityFrameworkdan melanjutkan hidup Anda:

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...
}

dan membuat hari saya juga karena saya tidak dapat menemukan solusi mengapa proyek startup saya tiba-tiba berhenti menemukan file konfigurasi. App.config dan <appname> .exe.config saya muncul di nampan proyek startup saya namun EntityFramework tidak dapat menemukan string koneksi yang telah saya gunakan selamanya. Saya memang menghapus sejumlah proyek yang tidak terpakai baru-baru ini dari solusi dan saya bertanya-tanya apakah itu ada hubungannya dengan itu. Saya memang menghapus proyek web dari solusi. Ingin tahu apakah proyek saya yang lain mengandalkan web.config atau sesuatu yang tidak biasa seperti itu.
GrayDwarf

Konfigurasi proyek yang sedang berjalan digunakan oleh semua proyek anak lainnya.
Serj Sagan

1
tetapi bagaimana cara mengatur nama penyedia?
FizxMike

9

Ketika Anda menduga, itu ada hubungannya dengan string koneksi berada di app.config dari pustaka kelas.

Salin entri dari app.config kelas ke wadah app.configatau web.configfile


8

Jika Anda memiliki beberapa proyek dalam solusi, maka atur proyek sebagai dimulai di mana Anda memiliki App.config kebenaran Anda.


7

salin string koneksi app.configatau web.configfile dalam proyek yang telah ditetapkan ke "Set as StartUpProject" dan jika dalam kasus menggunakan kerangka kerja entitas dalam proyek lapisan data - silakan instal kerangka kerja nuget di proyek utama.


4

Itu juga terjadi jika proyek startup diubah ke yang, yang tidak memiliki string koneksi .

  1. Solusi Klik Kanan - properti klik
  2. Di bawah Properti Umum, pilih proyek startup
  3. Pada panel kanan pilih proyek yang memiliki string koneksi (dalam kebanyakan kasus, itu akan menjadi proyek MVC - proyek yang memulai solusi)

Ya, itu berhasil. Saya telah membuat perpustakaan kelas untuk EF untuk berkomunikasi dengan DB & mendapatkan masalah yang sama.
Satinder Sidhu

4
  1. Tambahkan file App.Config
  2. Tetapkan proyek sebagai proyek startup.
  3. Pastikan Anda menambahkan string koneksi setelah entityFrameworkbagian:

    <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

Ya, itu konyol. Anda dapat menghindari menyalin string koneksi dengan menggunakan pembuat koneksi. Kode VB.Net (digunakan dalam produksi, tetapi sedikit dimodifikasi di sini, jadi perlakukan sebagai belum teruji, dengan senang hati membantu dengan masalah apa pun), di mana saya memiliki variabel serverName, variabel databaseName, saya meneruskannya ke metode dan membuatnya menghasilkan koneksi untuk saya:

    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

apakah Anda menggunakan lebih dari satu proyek pada solusi Anda?

Karena jika ya, konfigurasi web yang harus Anda periksa adalah yang ada di proyek yang sama dengan file de .edmx


Ya, ini masalahnya. Proyek yang berisi string koneksi adalah pustaka kelas yang hanya menyertakan file App.config. Proyek MVC tampaknya tidak memeriksa ini.
jjc99

selama pengembangan itu hanya akan chech app.config pada proyeknya, Anda harus menambahkan di sana
Diego

Terima kasih atas balasan Anda. Saya sudah mencoba menyalin string koneksi dari proyek yang berisi file edmx dan menempatkannya di file root web.config dalam proyek MVC saya. Sayangnya, masih belum menemukan string koneksi. Apakah saya harus memodifikasi string koneksi dengan cara apa pun?
jjc99

ini sebaliknya. Dalam waktu dev Anda membutuhkan con con pada app.cofnig pada Project yang memiliki file .edmx. Jika Anda memilikinya mungkin namanya salah. Nama string koneksi harus nama yang sama dengan properti "entitas containr name" dari file .edmx Anda
Diego

1

Tambahkan ConnectionString ke file MVC Project Web.config


1

Saya mengalami masalah ini ketika saya menggunakan beberapa proyects, mulai proyect dengan web.config dan app.config untuk proyek EntityFramework.

untuk menghindari masalah ini, Anda harus:

  1. Anda memerlukan string koneksi dalam file * .config yang dimulai.
  2. Anda perlu menginstal DLL EntityFramework ke dalam referensi Anda

1

Saya telah menghadapi masalah yang sama. Saya tidak dapat memasukkan string koneksi ke proyek startup karena saya melakukan operasi akses data dari lapisan lain. juga jika Anda tidak memiliki app.config di proyek startup Anda kemudian tambahkan file app.config dan kemudian tambahkan string koneksi ke file konfigurasi tersebut.


1
Terima kasih, saya punya masalah dengan memuat proyek saya dan kehilangan "Startup Project". Jawaban Anda mengingatkan saya untuk memastikan proyek dengan file Konteks dan app.config adalah Startup.
Mastro

1

Saya mendapatkan ini dengan tidak menetapkan proyek sebagai startup, seperti yang ditunjukkan oleh jawaban lain. Kontribusi saya dalam hal ini - ketika melakukan Add-Migrations dan Update-Database, tentukan proyek startup sebagai bagian dari perintah di Nuget Package Manager Console (jangan sertakan karakter '[' atau ']', itu hanya untuk menunjukkan kepada Anda bahwa Anda perlu mengubah teks yang ada di sana ke nama proyek Anda):

  1. Aktifkan-Migrasi
  2. Add-Migrations -StartupProject [nama proyek Anda yang berisi kelas konteks data]
  3. Update-Database -StartupProject [nama proyek yang sama seperti di atas]

Itu harus dilakukan.


Dengan cara ini Anda dapat memasukkan perintah dalam prosedur Anda dan tidak harus selalu mengubah proyek startup dari default.
JakeJ

1

Itu karena kelas konteks Anda sedang diwarisi dari DbContext. Saya kira ctor Anda seperti ini:

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

name=... harus diubah ke nama connectionString Anda


0

String koneksi yang dihasilkan oleh proyek yang berisi file .edmx menghasilkan string koneksi, ini akan muncul sebagai peninggalan dari app.config jenis file yang disalin ke direktori output dan direferensikan oleh executable untuk menyimpan informasi konfigurasi runtime.

Ini rusak dalam proyek web karena tidak ada proses otomatis untuk menambahkan informasi .config acak ke file web.config untuk proyek web.

Cara termudah adalah menyalin string koneksi dari file config ke bagian koneksi file web.config dan mengabaikan konten file config.


0

Cara terbaik yang baru saja saya temukan untuk mengatasi hal ini adalah dengan mengatur sementara proyek tersebut (kemungkinan besar perpustakaan kelas) untuk proyek startup. Ini memaksa konsol manajer paket untuk menggunakan proyek itu sebagai sumber konfigurasi. bagian dari alasannya diatur dengan cara ini adalah karena model top down yang biasanya diikuti oleh file-file konfigurasi. Aturan praktisnya adalah bahwa proyek yang paling dekat dengan klien (misalnya aplikasi MVC) adalah web.config atau app.config yang akan digunakan.


0

Pastikan Anda telah menempatkan string koneksi di ROOT web.config proyek startup.

Saya tahu saya agak menyatakan yang jelas di sini, tapi itu terjadi pada saya juga - meskipun saya sudah MEMILIKI string koneksi di Web proyek MVC saya. Konfigurasi (file .edmx ditempatkan di proyek perpustakaan kelas yang berbeda) dan saya tidak bisa mencari tahu mengapa saya terus mendapatkan pengecualian ... Singkatnya, saya menyalin string koneksi ke Views \ Web.Config secara tidak sengaja, dalam kombinasi aneh antara kelelahan dan tidak-bergulir-ke-bawah-dari skenario-the-solution-explorer. Ya, hal-hal ini juga terjadi pada pengembang veteran :)


0

Masalah ini terjadi ketika Anda menggunakan Layers di Proyek Anda dan mendefinisikan atau menginstal kerja frame Entity di DataLayer dan mencoba menjalankan Proyek Anda

Jadi untuk mengatasi masalah ini salin string koneksi dari lapisan di mana file Edmx ada dan tempelkan string koneksi di web.config utama.


0

Tambahkan string koneksi dalam file root web.config proyek MVC 'container' yang mereferensikan pustaka kelas sebagai berikut:

 <connectionStrings>

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

  </connectionStrings>

Jika Anda tidak ingin menggunakan "MyEntities" sebagai nama koneksi kemudian ubah sesuai keinginan tetapi buat perubahan berikut di kelas MyEntities DbContext Anda:

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

Alasan untuk kesalahan ini adalah, Jika kami tidak akan menentukan nama string koneksi atau menghubungkan string dalam kelas turunan DbConext (Dalam kasus Anda ini adalah MyEntities), maka DbContext akan secara otomatis mencari string koneksi di root web.config file whoes name is sama dengan nama kelas turunan (Dalam kasus Anda itu adalah Entitas Saya).


0

Saya punya masalah ini ketika menjalankan MSTest. Saya tidak bisa membuatnya bekerja tanpa bendera "noisolation".

Semoga ini bisa membantu seseorang. Habiskan banyak waktu untuk memikirkannya. Semuanya berjalan dengan baik dari IDE. Sesuatu yang aneh tentang Kerangka Entitas dalam konteks ini.


0

Migrasi reguler

Ada dua opsi - yang pertama yang disarankan semua orang di sini adalah untuk memastikan bahwa string koneksi ada di file Web.config proyek. Saat bekerja dengan string koneksi dari pengaturan aplikasi Azure, itu berarti menimpa nilai Web.config Anda dengan nilai-nilai Azure.

Migrasi biru atau otomatis (terprogram)

Ada opsi kedua yang tersedia jika Anda menjalankan migrasi secara terprogram, yang memungkinkan Anda untuk menjalankan migrasi menggunakan string koneksi yang diperoleh secara dinamis (atau melalui pengaturan aplikasi Azure) tanpa menyimpannya di Web.config:

Saat mengatur TargetDatabase konfigurasi , gunakan konstruktor DbConnectionInfo yang mengambil string koneksi dan nama penyedia alih-alih konstruktor yang hanya menggunakan nama koneksi. Jika string koneksi Anda tidak memiliki nama penyedia dan Anda menggunakan SQL Server / Azure SQL maka gunakan "System.Data.SqlClient"


0

Ini juga bisa mengakibatkan referensi dll yang tidak cukup direferensikan dalam kode panggilan. Retakan kikuk kecil bisa menyelamatkan hari Anda.

Saya mengikuti pendekatan DB First dan telah membuat file EDMX dalam proyek perpustakaan Kelas DAL, dan ini mengacu pada perpustakaan Kelas BAL, yang pada gilirannya direferensikan oleh layanan WCF.

Karena saya mendapatkan kesalahan ini di BAL, saya telah mencoba metode yang disebutkan di atas untuk menyalin detail konfigurasi dari App.config dari proyek DAL, tetapi tidak menyelesaikannya. Pada akhirnya dengan ujung seorang teman saya baru saja menambahkan file EDMX dummy ke proyek WCF (dengan DB Connectivity yang relevan dll), sehingga mengimpor semua yang diperlukan, dan kemudian saya hanya menghapus file EDMX, dan itu hanya menyingkirkan masalah dengan membangun bersih.


0

Ada komentar di jawaban teratas oleh @RyanMann yang menyarankan:

Simpan string koneksi Anda dalam satu file konfigurasi, lalu rujuk di proyek lain oleh <connectionString configSource="../ProjectDir/SharedConnections.config" />

Ini saran yang fantastis!

Ini juga berfungsi untuk berbagi string koneksi antara file App.config dan Web.config!

Siapa pun yang ingin mengikuti saran ini, harus menuju ke jawaban SO ini . Ini memiliki panduan langkah demi langkah yang sangat bagus untuk berbagi string koneksi di antara beberapa proyek dalam sebuah solusi.

Satu-satunya peringatan adalah bahwa configSourceharus ada di direktori atau sub-direktori yang sama. Tautan di atas menjelaskan cara menggunakan "Tambahkan sebagai Tautan" untuk menyiasati ini.


0

Saya mengalami kesalahan ini ketika mencoba menggunakan EF dalam plugin AutoCAD. Plugin CAD mendapatkan string koneksi dari file acad.exe.config. Tambahkan string sambung seperti yang disebutkan di atas ke file konfigurasi acad dan berfungsi.

Kredit jatuh ke Norman.Yuan dari ADN.Network.


0

Jika Anda menggunakan model MVVM, cobalah untuk menyalin string koneksi ke semua bagian proyek Anda.

Misalnya, jika solusi Anda berisi dua proyek, proyek perpustakaan kelas dan proyek wpf, Anda harus menyalin string koneksi dari proyek backend (pustaka kelas perpustakaan) dan menempatkan salinan di file App.config dari proyek wpf.

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

Semoga bermanfaat bagi Anda :)


-2

Tambahkan Connectoinstrnig di file web.config

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.