Sambungan bernama yang ditentukan tidak ditemukan dalam konfigurasi, tidak dimaksudkan untuk digunakan dengan penyedia EntityClient, atau tidak valid

170

Saya memiliki objek kerangka satu entitas dan ketika saya menambahkannya ke proyek saya, connectionstring ditambahkan ke app.configdalam connectionstringbagian, tetapi ketika saya ingin membuat yang baru entitycontextdan menggunakan ini connectionstring, kesalahan ini muncul

pengguna421413
sumber
4
Terima kasih untuk tautannya, Craig. Saya memilih untuk mempertahankan utas ini, karena judul itulah yang membantu saya menemukan kesalahan MetadataException.
jp2code
Ini terjadi pada saya ketika file konfigurasi tidak memperbarui dengan string koneksi untuk beberapa alasan aneh.
P.Brian.Mackey

Jawaban:

217

Saya menduga bahwa masalah Anda berasal dari fakta bahwa Anda memiliki lebih dari satu proyek dalam solusi Anda dan yang berisi hal-hal kerangka kerja entitas Anda termasuk edmxfile BUKAN proyek startup solusi. Dalam hal ini bahkan jika string koneksi ada dalam app.configproyek EF , CLR masih tidak dapat menemukannya saat runtime. Misalnya, jika Anda memiliki situs web dan proyek EF dalam solusi Anda, Anda perlu menyalin string koneksi dari proyek EF app.configke situs web Anda web.config. Pada dasarnya, data string koneksi apa pun harus ada dalam file konfigurasi proyek yang dimulai oleh .Net oleh CLR (yaitu proyek startup Anda). Jika ini bukan kasus Anda, maka buka sajaedmxfile, klik kanan pada permukaannya, pilih properti dan salin string koneksi dan tempel ke app.configbagian String Connection Anda . Dengan cara ini Anda dapat memastikan bahwa Anda memiliki yang benar dalam konfigurasi Anda.

EDIT:
Seperti yang Anda lihat di sini di Documenation on ObjectContext Constructor , parameter pertama adalah nama connectionstring yang merupakan kode yang dihasilkan pada saat Anda membuat EDM Anda. Jika, entah bagaimana, nama koneksi Anda muncul, semua yang perlu Anda lakukan adalah mengklik kanan pada model Anda dan memilih "Perbarui Model Dari Basis Data ..." kemudian ikuti wizard untuk memperbarui pembuat dan desainer Anda untuk mencerminkan ini perubahan.

Morteza Manavi
sumber
1
hai Morteza dan terima kasih atas jawaban Anda, tetapi saya sebelumnya menyalin sectin connectionstring di web.config, tetapi kesalahannya tidak terpecahkan, tetapi ketika di entitymodel.designer ganti (public EntityContext (): base ("name = EntityContext", EntityContext " )) sedikit pun hubungan koneksi ini berhasil, idae
user421413
1
@Morteza, apakah Anda memiliki solusi untuk proyek-proyek di mana majelis pelaksana tidak memiliki app.config? Dalam kasus saya, executable panggilan adalah aplikasi VB6 yang memanggil rakitan saya (di mana objek entitas berada) melalui COM Interop.
Perishable Dave
4
sangat sederhana, namun sangat membuat frustrasi. NAIK VOTE. Stackoverflow hidup lama!
granadaCoder
3
Jika Anda menggunakan WCF, ingatlah untuk memasukkan string koneksi dalam proyek layanan Anda
Nathan
1
Terima kasih Morteza, menyelamatkan saya banyak waktu!
Chris
32

Anda perlu menyalin string koneksi di app.config ke web.config Anda, atau menyalin seluruh file ke proyek yang menampilkan output. Ini adalah salah satu syarat untuk menggunakan kerangka kerja.

Musikero31
sumber
1
cukup tambahkan string koneksi yang sama (seperti dalam proyek akses Data) di web.config Anda (ditemukan di proyek front end).
Denmark
@ Musikero31 Saya menggunakan EF dan mendefinisikan semua string koneksi entitas dalam kode. Saya tidak memiliki apa pun dalam konfigurasi yang berkaitan dengannya.
Keith Beard
Setelah saya menyalin file DAL ke proyek baru, saya menerima kesalahan di atas juga. Melihat lebih dekat pada file konfigurasi, saya perhatikan bahwa string koneksi digantikan oleh EF. Saya dapat secara manual menyalin / menempelkan string koneksi yang benar ke proyek baru dan berhasil.
Ravi Ram
9

Saya mengalami masalah ini ketika saya mencoba untuk menempatkan logika database kustom saya dalam. Dll untuk digunakan oleh beberapa proyek dalam solusi saya.

Sementara .dll memiliki file app.config yang benar, itu tidak berhasil. Kerangka kerja entitas menginginkan informasi koneksi di app.config dari .exe. Menyalin informasi ke sana berfungsi dengan baik.

Solusi Morteza untuk menyisipkan string koneksi langsung ke .edmx tidak bekerja untuk saya, karena itu tidak akan membiarkan saya menempelkan nilai di sana - meskipun itulah yang ingin saya lakukan.

Walt Stoneburner
sumber
3
Meskipun hanya ada app.config (dan itu adalah satu-satunya file konfigurasi dalam direktori itu) di direktori exe saya, itu tidak akan membacanya. Saya harus mengganti nama file myExe.exe.config
Mario
6

Hai, saya punya masalah ini dan itu membuat saya gila. Bagaimanapun akhirnya saya menemukan apa masalahnya. Hal pertama yang harus Anda lakukan adalah memastikan bahwa connectionstringsdalam app.configdan web.configsama. Maka Anda harus mengklik dua kali pada .edmxfile sehingga Anda bisa melihat tabel. Setelah Anda mengklik di mana saja di dekat tabel tetapi tidak di atas meja dan pergi ke properti. Dari daftar turun bawah, pilih ConceptualEntityModeldan cari Nama Kontainer Entitas dan ingatlah dengan baik.

Selanjutnya pergi ke perancang file edmx dan buka konstruktor. (perancang adalah subfolder dari file edmx) konstruktor harus memiliki dua parameter dalam parameter BASE

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

ini salah satunya. parameter pertama harus memiliki nama file proyek di mana .edmxfile tersebut masuk. Parameter kedua harus memiliki nama nama wadah entitas dari properti yang saya sebutkan sebelumnya. jangan lupa untuk mengatur semua konstruktor dengan:base("", "")

Setidaknya itu adalah masalah saya dan masalah saya terpecahkan seperti itu. Saya harap Anda bisa menyelesaikan masalah Anda seperti ini.

MaltaCoders
sumber
6

Saya memiliki variasi dalam hal ini yang sepertinya tidak seorang pun membahasnya.

Saya punya proyek utama dengan beberapa model, dan Proyek Uji yang berisi tes unit. Proyek Uji berhasil, tetapi kemudian berhenti dengan kesalahan yang disebutkan dalam OP. Saya belum melakukan penggantian nama atau pemindahan file EDMX.

Banyak saran yang disebutkan membandingkan file .config, tetapi proyek saya tidak memilikinya sama sekali.

Pada akhirnya, saya menyalin file app.config dari proyek utama ke proyek pengujian saya dan kemudian berhasil. Apakah ini langkah yang benar, atau akan menghadirkan masalah pemeliharaan ketika model tambahan ditambahkan, saya tidak tahu, tapi setidaknya pengujian unit saya berjalan dengan benar lagi sekarang.

S. Baggy
sumber
Karena saya memposting ini, saya menyadari mungkin yang terbaik adalah membuat tautan ke file app.config dari proyek lain. Tapi tetap saja, pendekatan lain akan bekerja untuk memperbaiki masalah asli ketika tidak ada file konfigurasi sama sekali.
S. Baggy
4

Meskipun jawaban Morteza Manavi menyelesaikan masalah ini, solusi lain adalah membuat string koneksi secara dinamis dan meneruskannya ke konstruktor untuk ObjectContext Anda:

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());

Ini menghilangkan kebutuhan untuk menyalin informasi string koneksi ke app.config proyek startup Anda yang, setidaknya dalam kasus saya, tidak diinginkan.

Nick Spreitzer
sumber
4

Saya lupa menambahkan providerName = "System.Data.EntityClient" sebagai atribut dalam string koneksi. Ini mengakibatkan kesalahan ini begitu

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

dari pada

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

Saya baru saja menemukan bahwa jika sebuah aplikasi dibuat di IIS dari VS2010 dua tingkat dari root situs web kesalahan ini akan terjadi. Tidak yakin mengapa itu terjadi, perlu diselidiki lebih lanjut. Misalnya, jika aplikasi Anda berada di jalur ini: /admin/advertiserkesalahan akan muncul jika Anda tidak memiliki /admindirektori virtual di situs IIS Anda.

Yang saya lakukan adalah membuat admindirektori kosong di .../intepub/wwwrootkesalahan saya menghilang.

Anda akan menemukan bahwa Anda tidak akan dapat memulai debugging sampai Anda melakukan langkah di atas.

Kami memiliki masalah ini di tim kami di masa lalu, butuh beberapa waktu untuk mengingatnya tetapi ini adalah bagaimana kami memperbaikinya sebelumnya.

Jovica Zaric
sumber
1

Saya menggunakan arsitektur n'tier dan mendapat masalah yang sama tetapi yang ini membantu saya. Semoga ini bisa membantu Anda. Pertama Anda memiliki hal yang sama connection stringpada Anda di librariesmana Anda dapat mengakses DB seperti di app.configdan web.config setelah itu Anda cukup menambahkan konstruktor kelebihan beban dalam file .edmx (Model.context.cs) yang sekarang Anda memiliki dua konstruktor satu default dan yang lain baru saja Anda tambahkan ( kelebihan beban).

        public YourEntityName(string connString)
            : base(connString)
        {
        }
Muhammad Asad
sumber
1

Saya memiliki perpustakaan kelas yang juga tidak ingin bekerja dengan EF. Setelah saya menyalin app.config (atau hanya bagian connectionstring) dari perpustakaan kelas saya ke proyek exe koneksi bekerja dengan baik! Mungkin file config diharapkan berada di folder yang sama dengan proyek exe dan karenanya tidak ditemukan. Jadi, selalu berhati-hatilah saat file konfigurasi digunakan dalam proyek perpustakaan kelas!

Vincent
sumber
0

Yah ... masalah ini bisa juga karena alasan (bodoh) yang sangat sederhana ... Saya menyalin file dari proyek lain dan lupa mengubah ConnectionString pada EntityDataSource ... saat saya berada di awal proyek dan terjadi di halaman login, saya pikir itu adalah sesuatu di konfigurasi, tetapi hanya nama string koneksi yang salah (dan DefaultContainerName).

Gabriel G
sumber