MetadataException: Tidak dapat memuat sumber daya metadata yang ditentukan

681

Tiba-tiba saya terus mendapatkan MetadataExceptioninstantiate ObjectContextkelas yang dihasilkan saya . String koneksi di App.Config terlihat benar - belum berubah sejak terakhir kali berfungsi - dan saya telah mencoba membuat kembali model baru (edmx-file) dari database yang mendasarinya tanpa perubahan.

Adakah yang punya ide?

Rincian lebih lanjut: Saya belum mengubah sifat apa pun, saya belum mengubah nama majelis keluaran, saya belum mencoba menyematkan EDMX di perakitan. Saya hanya menunggu 10 jam dari meninggalkan pekerjaan sampai saya kembali. Dan kemudian itu tidak berfungsi lagi.

Saya sudah mencoba membuat ulang EDMX. Saya sudah mencoba membuat ulang proyek. Saya bahkan sudah mencoba membuat ulang database, dari awal. Tidak beruntung, apa pun.

J. Steen
sumber
14
Jika pertanyaan SO tentang produk tertentu yang memiliki lebih dari 200 ribu tampilan, maka produk tersebut tidak berfungsi seperti yang diharapkan pengguna. Saya ingin melihat alamat Microsoft ini. Berikut tautan untuk memberi mereka saran jika Anda punya waktu: visualstudio.uservoice.com/forums/121579-visual-studio .
Tony L.
Masalah saya terpecahkan, dengan mengganti koneksi-string yang disalin dari proyek db-layer.
Hardik

Jawaban:

856

Ini berarti bahwa aplikasi tidak dapat memuat EDMX. Ada beberapa hal yang dapat menyebabkan hal ini.

  • Anda mungkin telah mengubah properti MetadataArtifactProcessing dari model untuk Salin ke Direktori Output.
  • String koneksi bisa salah. Saya tahu Anda mengatakan Anda belum mengubahnya, tetapi jika Anda telah mengubah hal-hal lain (katakanlah, nama majelis), itu mungkin masih salah.
  • Anda mungkin menggunakan tugas pasca-kompilasi untuk menanamkan EDMX dalam perakitan, yang tidak lagi berfungsi karena beberapa alasan.

Singkatnya, tidak ada cukup detail dalam pertanyaan Anda untuk memberikan jawaban yang akurat, tetapi semoga ide-ide ini membuat Anda berada di jalur yang benar.

Pembaruan: Saya telah menulis posting blog dengan langkah-langkah yang lebih lengkap untuk pemecahan masalah .

Craig Stuntz
sumber
70
The ConnectionString, meskipun upaya saya untuk membandingkannya dengan konten-membandingkan utilitas terakhir kali, itu salah.
J. Steen
16
Itu juga merupakan tali penghubung bagi saya. Ketika Anda memiliki Tes Integrasi yang juga perlu koneksisting di App.config sendiri, hal-hal mungkin tidak sinkron ketika Anda memperbarui edmx Anda.
Ray
11
OK, saya memperbaikinya hanya dengan mengatur "Sematkan"; kompilasi, lalu setel ulang ke yang lain. Itu memecahkan masalah saya.
Shimmy Weitzhandler
6
Punya masalah yang sama, mencoba solusi Anda, ingin memberi +1, menyadari saya sudah melakukannya di masa lalu. Saya bahkan tidak ingat pernah mengalami masalah ini sebelumnya;). Kali ini dalam kasus saya itu adalah string koneksi yang benar di Perpustakaan Kelas dengan edmx dan salah dalam aplikasi web ketika digunakan.
Episodex
9
Panduan yang luar biasa. Bagi saya, saya telah menyalin string koneksi lain yang menggunakan res: // * / Database.MyModel2 ..., ketika saya BENAR-BENAR menginginkan res: // * / MyModel1 ... (Database adalah folder di dalam proyek Tes Integrasi saya)
emragins
360

Perubahan kecil ini membantu masalah ini.

Saya punya Solusi dengan 3 proyek.

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

mengubah

connectionString="metadata=res://*/;
MicTech
sumber
11
Ini memperbaikinya untuk saya, tetapi apa artinya?
Lance Fisher
18
@ Lance: Saya jelaskan ini secara terperinci dalam posting blog ini
Craig Stuntz
4
@ jocull: Tidak, itu tidak akan berfungsi dalam banyak kasus, dan akan lambat di yang lain. Baca posting blog saya untuk memahami alasannya.
Craig Stuntz
6
Memindahkan .edmx ke folder Model dan lupa memperbarui string koneksi. Pointer yang bagus. Terima kasih. Akan membutuhkan waktu berjam-jam untuk mencari tahu.
muruge
11
Anda telah menyelamatkan karyawan Microsoft yang buruk dari konsumen yang sangat marah.
The Muffin Man
115

Anda bisa mendapatkan pengecualian ini ketika Edmx dalam satu proyek dan Anda menggunakannya dari yang lain.

Alasannya adalah Res://*/uri yang menunjuk ke sumber daya di majelis CURRENT. Jika Edm didefinisikan dalam rakitan berbeda dari kode yang menggunakannya, res: // * / tidak akan berfungsi karena sumber daya tidak dapat ditemukan.

Alih-alih menentukan '*', Anda harus memberikan nama lengkap majelis sebagai gantinya (termasuk token kunci publik). Misalnya:

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

Cara yang lebih baik untuk membangun string koneksi adalah dengan 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();
}

Jika Anda masih menemukan pengecualian, buka rakitan di reflektor dan periksa nama file untuk file .csdl, .ssdl dan .msl Anda. Ketika sumber daya memiliki nama yang berbeda dengan yang ditentukan dalam nilai metadata, itu tidak akan berfungsi.

pengguna276695
sumber
8
Harap pertimbangkan bahwa "YourEdmxFileName" harus nama yang memenuhi syarat mis. "YourNamespace.YourEdmxFileName" Anda, jika Anda menggunakan ruang nama dalam majelis Anda. Namun, Anda harus menghapus bagian namespace yang sama dengan nama majelis Anda.
Marcel
5
MSDN mengatakan paragraf kedua salah. "Ketika Anda menggunakan wildcard (*), Kerangka Entity harus melihat semua kumpulan untuk sumber daya dengan nama yang benar."
Craig Stuntz
Saya cukup yakin bahwa namespace tidak relevan, tetapi jalur file yang disematkan adalah. Jadi, bahkan jika Anda memeriksa file * .Designer.cs dari file edmx terkait dan perhatikan bahwa namespace kelas yang dibuat secara otomatis adalah MyCompany ... apa pun, itu bukan apa yang harus Anda gunakan. Alih-alih path adalah assemblyname, folder solusi (s) nama / nama file. Misalnya: "metadata = res: // * / EntityModels. <filename> .csdl |" + "res: // * / EntityModels. <filename> .ssdl |" + "res: // * / EntityModels. <filename> .msl;"
Daniel
1
@Aniel, itu sebagian besar benar, tetapi perhatikan bahwa namespace dan path file yang disematkan terkadang sama. Anda harus memastikan reflektor (atau alternatif gratis).
Craig Stuntz
sepertinya hanya berfungsi menggunakan nama majelis, tanpa versi, publickeytoken, dll. Seperti:res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa
67

Saya memiliki kesalahan serupa. Saya telah menciptakan kembali proyek (cerita panjang), dan menarik semuanya dari proyek lama. Saya tidak menyadari bahwa model saya berada di direktori yang disebut 'Model' sebelumnya, dan sekarang berada di direktori yang disebut 'Model'. Setelah saya mengubah koneksi di Web saya. Konfigurasi dari ini:

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

untuk ini:

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

Semuanya bekerja (diubah Modelmenjadi Models). Perhatikan bahwa saya harus mengubah tiga tempat ini dalam string ini.

Rick Arthur
sumber
2
Saya memindahkan model Entity Framework saya dari Model ke DAL. Tapi kemudian ketika saya menulis tes (seminggu kemudian) di proyek uji untuk menguji predicatebuilder Linq. Saya mendapat kesalahan ini. Saya mengoreksi proyek uji coba App.config dengan tampilannya di web.config proyek utama - seperti yang Anda katakan di tiga tempat. Jadi jawaban Anda yang sederhana membuat saya tepat sasaran.
Patrik Lindström
Ya terima kasih - periksa nama file Anda. Entah bagaimana saya memiliki nama lama.
PeterX
7
Apakah ada perbedaan antara keduanya?
Erwin Rooijakkers
2
@ErwinRooijakkers Model vs ModelS
Marc
Mencari tahu saya telah melakukan hal yang sama setelah membaca blog Craig, tetapi +1 untuk belajar, penting untuk diingat bahwa perubahan yang dibuat di perpustakaan kelas "entitas" Anda tidak secara otomatis dibuat dalam file konfigurasi proyek yang merujuknya. Aku senang aku tidak sendirian.
ruffin
26

Dan cara cepat untuk memeriksa nama model tanpa Reflector .... lihat direktori

... obj / {config output} / edmxResourcesToEmbed

dan periksa apakah file sumber daya .csdl, .msl, dan .ssdl ada di sana. Jika mereka berada dalam sub-direktori, nama sub-direktori harus didahulukan dengan nama model.

Sebagai contoh, tiga file sumber daya saya ada di Sub-direktori Data , jadi string koneksi saya harus

metadata = res: // * / Data .MyModel.csdl | res: // * / Data .MyModel.ssdl | res: // * / Data .MyModel.msl;

(versus metadata = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl;).

leqid
sumber
Ini PERSIS masalah saya. Kehilangan beberapa jam karena ini. Terima kasih banyak atas penjelasan yang mudah ini
Fernando Carvalhosa
Jawaban yang bagus, sebenarnya menjelaskan bagaimana menemukan string Anda. Dan menunjukkan bahwa subfolder memiliki '.' sebagai pembatas dan bukan '\' atau '/'.
cjb110
16

Saya juga punya masalah ini dan itu karena connectionstring di web.config saya sedikit berbeda dari yang ada di app.config dari assembly di mana EDMX saya berada. Tidak tahu mengapa itu berubah, tetapi di sini adalah dua versi yang berbeda.

App.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" />

Apa yang diperbaiki hanyalah menyalin string app.config (perhatikan perbedaan kecil di akhir - alih-alih " App=EntityFramework" ia inginkan " application name=EntityFramework") ke web.config dan masalah terpecahkan. :)

Ghlouw
sumber
1
Terima kasih, ini memang masalah saya. Saya punya 1 proyek yang mengakses DB dengan EF dan proyek WCF lainnya. Setelah mengubah nama proyek pertama, connectionString telah diubah di App.config dari proyek pertama saya. Jadi saya harus mengubah connectionString di proyek WCF juga di web.config :)
Volkan
Dari dokumentasi MSDN tentang docs.microsoft.com/en-us/dotnet/framework/data/adonet/… : 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.string koneksi Entity Framework tidak membagikan fleksibilitas itu, jadi Anda harus menggunakan hanya kata kunci yang diharapkan.
Suncat2000
13

Ini terjadi pada saya ketika saya secara tidak sengaja mengganti Action Build dari file edmx (muncul di bawah Properties di IDE) dari 'EntityDeploy' ke 'None'. EntityDeploy adalah apa yang mengisi metadata untuk Anda: lihat http://msdn.microsoft.com/en-us/library/cc982037.aspx

hgcummings
sumber
Ini adalah perbaikan saya - saya mengganti nama edmx saya menjadi .old saat saya menyalinnya dan sedang mencoba beberapa hal, setelah itu ketika saya menamainya kembali Build Action mengaturnya sendiri menjadi tidak ada dan dengan demikian mendapatkan kesalahan ini, mengaturnya kembali ke EntityDeploy diselesaikan masalah saya :)
eth0
Saya telah memindahkan file EDMX saya ke folder lain dan harus mengubah aksi build untuk mendapatkan nama sumber daya yang tertanam untuk diperbarui juga. Terima kasih!
David
Ini solusi bagi saya; Saya telah kehilangan pengaturan itu dalam proses peningkatan ke .NET Standard. Terima kasih telah menyelamatkan kewarasan saya!
NetherGranite
11

Ini terjadi pada saya ketika saya tidak membersihkan solusi sebelum membangun desainer .edmx baru. Jadi jangan lupa untuk membersihkan solusi sebelum Anda membangun desainer .edmx baru. Ini membantu saya untuk melewatkan lebih banyak masalah dengan yang ini. Di bawah detail navigasi yang disediakan jika Anda baru di studio visual.

Klik-> Bangun-> Solusi Bersih

Kemudian Klik-> Build-> Rebuild Solution

Semoga ini membantu. Terimakasih semuanya

Liakat
sumber
8

Saya baru saja menghabiskan 30 menit bahagia dengan ini. Saya telah mengubah nama objek entitas, mengubah entri pada file konfigurasi, tetapi masih ada lagi ... Anda harus mengubah referensi ke csdl juga

sangat mudah dilewatkan - jika Anda mengganti nama, pastikan Anda mendapatkan semuanya ....

TobyEvans
sumber
6

Saya memiliki masalah yang sama. Saya melihat dll saya yang sesuai dengan reflektor dan telah melihat bahwa nama sumber daya itu tidak benar. Saya berganti nama dan sekarang terlihat baik-baik saja.

Mengadu
sumber
6

Untuk kasus saya, ini diselesaikan dengan mengubah properti file edmx.

  1. Buka file edmx
  2. Klik kanan di sembarang tempat desainer EDMX
  3. pilih properti
  4. perbarui Properti yang disebut "Metadata Artifact Processing" menjadi "Embed in Output Assembly"

ini memecahkan masalah bagi saya. Masalahnya adalah, ketika wadah mencoba menemukan data meta, ia tidak dapat menemukannya. jadi cukup membuatnya di majelis yang sama. solusi ini tidak akan berfungsi jika Anda memiliki file edmx di majelis lain

pengguna464507
sumber
+1.000.000 ini adalah masalah mendasar bagi saya hari ini. Susah mengatur kembali suatu ruang nama produk dan mengkonsolidasikan majelis.
Mike
6

Saya menghabiskan sepanjang hari untuk kesalahan ini

jika Anda bekerja dengan n-tear architecture

atau Anda mencoba separate Modelsdihasilkan oleh EDMXformulir DataAccessLayer untukDomainModelLayer

mungkin Anda akan mendapatkan kesalahan ini

  1. Langkah pemecahan masalah pertama adalah untuk memastikan string koneksi webconfig (UILayer)dan appconfig (DataAccessLayer)sama
  2. Kedua yang sangat penting itu connection string

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

    yang mana masalahnya

dari mana di bumi saya dapatkan Modelatau apa pun .csdl di string koneksi saya di mana mereka

di sini saya solusi kami lihat gambar

masukkan deskripsi gambar di sini

semoga membantu anda

Basheer AL-MOMANI
sumber
5

Saya bisa menyelesaikan ini di Visual Studio 2010, VB.net (ASP.NET) 4.0.

Selama wizard model entitas, Anda akan dapat melihat string koneksi entitas. Dari sana Anda dapat menyalin dan menempel ke string koneksi Anda.

Satu-satunya hal yang saya lewatkan adalah "App_Code." dalam string koneksi.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
Insinyur Internet
sumber
Sayangnya, string penghubung di wizard tidak benar untuk app.config. @leqid menyarankan cara yang baik untuk memperbaiki jalur ke model.
Der_Meister
5

Setelah berjam-jam googling dan mencoba memecahkan tidak ada solusi yang disarankan berhasil. Saya telah mendaftarkan beberapa solusi di sini. Saya juga mencatat satu yang bekerja untuk saya. (Saya menggunakan EF versi 6.1.1, dan SQL server 2014 - tetapi DB yang lebih lama)

  1. Membangun kembali proyek dan coba lagi.
  2. Tutup dan buka VS - Saya tidak tahu cara kerjanya
  3. pastikan jika Anda telah menempatkan file .EDMX di dalam Direktori, pastikan Anda memasukkan Direktori di ConnectionString Anda. misalnya milikku ada di dalam folder DAL. JADI kelihatannya seperti ini: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(ini adalah file. Untuk melihatnya, Anda dapat beralih Tampilkan Semua File dalam solusi explorer, di bawah direktori ~ / obj / ..)

... dan masih banyak lagi yang saya coba [seperti: mengembalikan versi EntityFramework ke versi yang lebih baru (tidak yakin tentang itu)]


apa yang berhasil untuk saya:

dari artikel ini di sini , itu membantu saya menyelesaikan masalah saya. Saya baru saja mengubah ProviderManifestToken="2012"ke ProviderManifestToken="2008"dalam file EDMX. Untuk melakukan ini:

Penjelajah solusi

  1. Klik kanan pada file .edmx
  2. Buka dengan..
  3. Editor XML
  4. Ubah ProviderManifestToken = "XXXX" dengan 2008

Saya harap itu membantu.

ben
sumber
Saya baru-baru ini mengalami masalah ini setelah membuat tampaknya tidak ada perubahan. Mencoba memulai kembali VS tidak berhasil, tetapi kemudian diperbaiki dengan membersihkan dan membangun kembali. Jadi, bagi orang lain, jika Anda tidak membuat perubahan dan semua ini tampaknya tidak relevan, maka cobalah / bersihkan kembali coba.
Greg
5

Jika Anda menggunakan edmx dari proyek yang berbeda, maka dalam string koneksi, ubah ...

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

...untuk...

metadata=res://*/DataModel.csdl
Graham Laight
sumber
Ini benar, Jika Anda ingin memindahkannya ke sub folder proyek baru Anda, Anda perlu menambahkannya folder.subfoldersebelumnya.
qakmak
Terima kasih, solusi ini berhasil untuk saya. Saya telah memindahkan file .edmx saya dari dir dalam satu proyek, ke root proyek lain, dan perlu menghapus nama dir dari semua string koneksi di solusi saya.
Chris
4

Solusi utama (bahkan setelah membuat ulang database di dua mesin lain, serta EDMX dan serba-serbi lain) adalah tidak menggunakan edisi pertama dari Entity Framework. Menanti untuk mengevaluasi lagi di .NET 4.0.

Setelah mengalami masalah yang sama lagi dan mencari seluruh jawaban, saya akhirnya menemukan seseorang yang memiliki masalah yang sama. Tampaknya string koneksi tidak dibuat dengan benar oleh wizard Visual Studio, dan tautan ke sumber daya metadata tidak memiliki jalur penting.

v1.0 BUG ?: Tidak dapat memuat sumber daya metadata yang ditentukan. Script! = Model

Pembaruan 2013-01-16 : Setelah beralih ke hampir secara eksklusif menggunakan praktik EF Code First (bahkan dengan database yang ada) masalah ini tidak lagi menjadi masalah. Bagi saya, itu adalah solusi yang layak untuk mengurangi kekacauan dari kode dan konfigurasi yang dibuat secara otomatis dan meningkatkan kendali saya sendiri terhadap produk.

J. Steen
sumber
4

Masalah dan solusi saya, gejalanya sama "Tidak dapat memuat sumber daya metadata yang ditentukan" tetapi akar penyebabnya berbeda. Saya punya 2 proyek dalam solusi satu adalah EntityModel dan yang lainnya solusinya. Saya benar-benar menghapus dan menciptakan kembali file EDMX di EntityModel.

Solusinya adalah saya harus kembali ke proyek Aplikasi Web dan menambahkan baris ini ke file konfigurasi. Model baru telah mengubah beberapa item yang harus diduplikasi dalam file Web.Config proyek "lain". Konfigurasi lama tidak lagi bagus.

     <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" />
John Peters
sumber
4

Terkadang saya melihat kesalahan ini di proyek saya. Saya menyelesaikannya dengan

1 - Klik kanan pada file EDMX

2 - Pilih Run Custom Toolopsi

3 - Membangun kembali proyek

MOH3N
sumber
Ini bekerja untuk saya tetapi saya juga harus membangun kembali setelah itu
rdans
3

Dalam kasus saya, masalah ini terkait dengan penggantian nama file edmx model saya ... memperbaiki string koneksi app.config untuk file csdl / ssdl / msl memperbaiki masalah saya.

Jika Anda menggunakan desainer EF 4.0 untuk menghasilkan csdl / ssdl / msl Anda, 3 "file" ini sebenarnya akan disimpan dalam file edmx utama model. Dalam hal ini, pos oleh Waqas cukup banyak sasaran. Penting untuk memahami bahwa "Model_Name" dalam contohnya perlu diubah menjadi apa pun nama file .edmx model Anda saat ini (tanpa .edmx).

Selain itu, jika file edmx Anda tidak berada di level root proyek Anda, Anda perlu mengawali Model_Name dengan jalur relatif, mis.

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

akan menentukan csdl / ssdl / msl xml disimpan dalam file model 'WidgetModel.edmx' yang disimpan dalam folder bernama 'MyModel'.

Janmon
sumber
3

Saya telah menulis kelas pembantu ini untuk membuat instance objek ObjectContext ketika mereka didefinisikan dalam proyek yang berbeda dari proyek yang menggunakannya. Saya mengurai string koneksi dalam file konfigurasi dan mengganti '*' dengan nama perakitan lengkap.

Itu tidak sempurna karena menggunakan refleksi untuk membangun objek, tetapi itu adalah cara paling umum untuk melakukannya yang bisa saya temukan.

Semoga ini bisa membantu seseorang.

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;
    }
}
lau
sumber
3

Untuk kalian semua SelftrackingEntities Pengguna, jika Anda telah mengikuti Microsoft Walk-through dan memisahkan kelas konteks Objek ke proyek layanan wcf (dengan menautkan ke konteks .tt) sehingga jawaban ini untuk Anda:

bagian dari jawaban yang ditampilkan dalam posting ini yang mencakup kode seperti:

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

TIDAK AKAN BEKERJA UNTUK ANDA !! alasannya adalah bahwa YourObjectContextType.Assemblysekarang berada di Assembley yang berbeda (di dalam perakitan proyek WCF),

Jadi Anda harus menggantinya YourObjectContextType.Assembly.FullName dengan ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

Selamat bersenang-senang.

Robocide
sumber
2

Saya mengalami masalah dengan pesan kesalahan yang sama ini. Masalah saya telah diatasi dengan menutup dan membuka kembali Visual Studio 2010.

Adam
sumber
2

Punya masalah yang sama karena saya mengganti nama majelis.

Saya juga harus mengganti nama dalam atribut AssemblyTitle dan AssemblyProduct di proyek Properties / AssemblyInfo.cs, dan juga menghapus dan menambahkan kembali referensi ke file edmx.

Kemudian itu bekerja dengan baik.

Antoine Meltzheim
sumber
2

Dengan memiliki masalah yang sama saya membuat ulang edmx dari Database. Memecahkan masalah saya.

صفي
sumber
2
Sayangnya itu mengatasi dan mengobati gejalanya, bukan penyebabnya.
Clarice Bouwer
2

Pengecualian adalah karena kompiler menunjuk ke Metadata yang tidak ada, jadi cukup Salin app.config connectionstring ke Web.configConnectionString

Krishna shidnekoppa
sumber
1

Saya juga memiliki masalah dan solusi yang sama seperti Rick, kecuali bahwa saya mengimpor .edmx yang sudah ada ke proyek baru, dan sementara namespace dasar tidak masalah itu diimpor ke subdirektori yang berbeda jadi saya juga harus memperbarui koneksi string di dalam Web.Config di tiga tempat, untuk memasukkan penamaan subdirektori yang berbeda:

eagle779
sumber
1

Saya memiliki masalah yang sama dengan solusi yang berisi proyek dalam Folder Solusi, ketika mereka dipindahkan ke Root Solusi (untuk mengatasi bug yang dicurigai dengan Mvc3AppConverter karena lokasi proyek).

Meskipun solusi dikompilasi setelah semua * referensi proyek ditambahkan kembali sesuai kebutuhan, kesalahan dilemparkan ketika situs web diaktifkan

EDMX ada di salah satu proyek yang dipindahkan (proyek 'Data'), tetapi tentu saja kurangnya referensi ke proyek Data tidak menyebabkan kesalahan kompilasi, hanya kesalahan run-time.

Cukup menambahkan referensi yang hilang ke proyek utama untuk menyelesaikan masalah ini, tidak perlu mengedit koneksi sama sekali.

Saya harap ini membantu orang lain.

Chris
sumber
1

Sedangkan saya, saya telah memisahkan Data Access Layer dan lapisan User Interface. Jadi saya punya string koneksi entitas untuk setiap layer.

Sebelum saya mengubah dua string koneksi yang terpisah menjadi sama, saya masih menemukan kesalahan di bawah ini.

Unable to load the specified metadata resource

Jadi saya membuat string koneksi yang sama untuk dua lapisan (DAL, UI), Ini berfungsi dengan sempurna.

Solusi saya adalah membuat semua string koneksi tetap sama di mana pun mereka sudah disajikan .

Frank Myat Thu
sumber
1

Saya punya masalah ini kemarin dan sedang melihat kode saya di debug dan output dari SQL Profiler.

Apa yang saya tidak bisa mengerti, sebelum saya membaca dan memahami posting ini, adalah mengapa EntityFramework melempar kesalahan ini karena memanggil DB. Saya sedang mencari melalui ratusan baris dalam SQL Profiler mencoba mencari tahu apa yang salah dengan model database. Saya tidak dapat menemukan apa pun seperti panggilan yang saya harapkan, dan sejujurnya saya tidak yakin apa yang saya cari.

Jika Anda berada di posisi ini, periksa string koneksi. Dugaan saya adalah bahwa sebelum EntityFramework membuat SQL-nya, ia akan memeriksa model, yang ditentukan di bagian metadata dari string koneksi. Dalam kasus saya itu salah. EntityFramework bahkan tidak mencapai DB.

Pastikan nama-nama itu benar. Setelah saya menyelesaikannya, saya kemudian melihat panggilan dalam SQL Profiler di mana ApplicationName adalah 'EntityFramework' dengan SQL memanggil tabel yang diharapkan.

Daniel Hollinrake
sumber
1

File app.config atau web.config yang buruk dapat melakukan ini .. Saya telah menyalin string koneksi app.config ke web.config saya di UI saya dan akhirnya memasukkan:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
MyDaftQuestions
sumber