MetadataException: Belirtilen meta veri kaynağı yüklenemedi


681

Birdenbire MetadataException, oluşturulan ObjectContextsınıfımı örneklemeye devam ediyorum . App.Config içindeki bağlantı dizesi doğru görünüyor - son çalıştığından beri değişmedi - ve temel veritabanından hiçbir değişiklik yapmadan yeni bir model (edmx dosyası) oluşturmayı denedim.

Herhangi bir fikri olan var mı?

Diğer ayrıntılar: Herhangi bir özelliği değiştirmedim, herhangi bir çıktı derlemesinin adını değiştirmedim, EDMX'i derlemeye gömmeye çalışmadım. İşten ayrılmamdan geri dönene kadar 10 saat bekledim. Ve sonra artık çalışmadı.

EDMX'i yeniden oluşturmayı denedim. Projeyi yeniden yaratmayı denedim. Hatta sıfırdan veritabanı yeniden oluşturmayı denedim. Hiç şans yok.


14
200 binden fazla görüntülemeye sahip belirli bir ürünle ilgili SO sorusu varsa, ürün kullanıcıların beklediği şekilde çalışmaz. Microsoft'un bunu ele almak istiyorum. Zamanınız varsa onlara önerilerde bulunmak için bir link: visualstudio.uservoice.com/forums/121579-visual-studio .
Tony L.

Sorunum, db-layer projesinden kopyalanan bağlantı dizesini değiştirerek çözüldü.
Hardik

Yanıtlar:


857

Bu, uygulamanın EDMX'i yükleyemediği anlamına gelir. Buna neden olabilecek birkaç şey var.

  • Modelin MetadataArtifactProcessing özelliğini Çıktı Dizine Kopyala olarak değiştirmiş olabilirsiniz.
  • Bağlantı dizesi yanlış olabilir. Bunu değiştirmediğini söylediğini biliyorum, ama başka şeyleri değiştirdiysen (diyelim ki bir meclisin adı), yine de yanlış olabilir.
  • EDMX'i derlemeye gömmek için derleme sonrası bir görev kullanıyor olabilirsiniz; bu, artık bir nedenle çalışmaz.

Kısacası, sorunuzda doğru bir cevap vermek için gerçekten yeterli ayrıntı yok, ancak umarım bu fikirler sizi doğru yola sokmalıdır.

Güncelleme: Sorun giderme için daha ayrıntılı adımlar içeren bir blog yazısı yazdım .


70
Linkstring, geçen sefer bir içerik karşılaştırma yardımcı programı ile karşılaştırma çabalarıma rağmen , yanlıştı.
J. Steen

16
Benim için de bağlantı trendi. Kendi App.config dosyasında da bağlantı kurması gereken Entegrasyon Testleri varsa, edmx'inizi güncellediğinizde işler senkronize olmayabilir.
Ray

11
Tamam, ben sadece "Embed" ayarlayarak sabit; derleme, sonra diğerine sıfırlama. Bu benim sorunumu çözdü.
Shimmy Weitzhandler

6
Aynı sorun vardı, çözümünüzü denedim, +1 vermek istedim, geçmişte zaten yaptığımı fark ettim. Daha önce bu sorunu yaşadığımı bile hatırlamıyorum;). Benim durumumda Bu kez edmx ile Sınıf Kütüphanesi doğru bağlantı dizesi ve kullanıldığında web uygulamasında yanlış oldu.
Episodex

9
Harika bir rehber. Benim için res: // * / Database.MyModel2 ... kullanılan başka bir bağlantı dizesi kopyaladım, GERÇEKTEN res: // * / MyModel1 ... (Veritabanı Entegrasyon Testleri projemin içindeki bir klasör)
13'te 0:25

361

Bu küçük değişiklik bu soruna yardımcı olur.

3 proje ile çözümüm var.

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

değişmek

connectionString="metadata=res://*/;

11
Benim için düzeltti, ama bu ne anlama geliyor?
Lance Fisher


4
@jocull: Hayır, pek çok durumda işe yaramaz ve diğerlerinde yavaş olur. Nedenini anlamak için blog yayınımı okuyun.
Craig Stuntz

6
.Edmx'imi Model klasörüne taşıdı ve bağlantı dizesini güncellemeyi unuttum. Harika işaretçi. Teşekkürler. Anlamak için saatlerimi alırdım.
muruge

11
Efendim, kötü bir Microsoft çalışanını çok sinirli bir tüketiciden kurtardınız.
Muffin Man

115

Edmx bir projedeyken ve başka bir projeden kullanırken bu istisnayı alabilirsiniz.

Bunun nedeni, Res://*/MEVCUT meclisindeki kaynaklara işaret eden bir uri. Edm, onu kullanan koddan farklı bir derlemede tanımlıysa, kaynak bulunamadığından res: // * / çalışmaz.

'*' Belirtmek yerine, derlemenin tam adını sağlamanız gerekir (genel anahtar belirteci dahil). Örneğin:

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

Bağlantı dizeleri oluşturmanın daha iyi bir yolu EntityConnectionStringBuilder'dir:

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

Kural dışı durumla karşılaşmaya devam ediyorsanız, montajı reflektörde açın ve .csdl, .ssdl ve .msl dosyalarınızın dosya adlarını kontrol edin. Kaynakların meta veri değerinde belirtilenlerden farklı adları varsa, işe yaramaz.


8
Lütfen derlemenizde ad alanları kullanıyorsanız, "YourEdmxFileName" ifadesinin nitelikli ad olması gerektiğini düşünün, örneğin "YourNamespace.YourEdmxFileName" Ancak, ad alanının derlemenizin adına eşit olan kısmını kaldırmanız gerekir.
Marcel

5
MSDN ikinci paragrafın yanlış olduğunu söylüyor. "Joker karakter (*) kullandığınızda, Entity Framework, doğru derlemeye sahip kaynaklar için tüm derlemeleri aramak zorundadır."
Craig Stuntz

Ad alanının ilgili olmadığından eminim, ancak katıştırılmış dosya yolu. Dolayısıyla, ilişkili edmx dosyasının * .Designer.cs dosyasını inceleseniz ve otomatik olarak oluşturulan sınıf ad alanının MyCompany ... olduğunu fark etseniz bile, ne kullanmanız gerektiği değil. Bunun yerine yol, montaj adı, çözüm klasör (ler) i / dosya adıdır. Örneğin: "meta veri = res: // * / EntityModels. <Dosyaadı> .csdl |" + "res: // * / EntityModels. <dosyaadı> .ssdl |" + "res: // * / EntityModels. <dosyaadı> .msl;"
Daniel

1
@Daniel, bu çoğunlukla doğrudur, ancak ad alanının ve katıştırılmış dosya yolunun bazen aynı olduğunu unutmayın. Emin olmak için Reflektör'e (veya buna ücretsiz bir alternatife) bakmak zorundasınız.
Craig Stuntz

o, PublicKeyToken sürüm olmadan, vb Beğen sadece montaj adını kullanarak çalışıyor gibi görünüyor:res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa

67

Benzer bir hatayla karşılaştım. Projeyi yeniden yarattım (uzun hikaye) ve her şeyi eski projeden çıkardım. Modelimin daha önce 'Model' adlı bir dizinde olduğunu ve şimdi 'Modeller' adlı bir dizinde olduğunu fark etmemiştim. Web.Config dosyamdaki bağlantıyı buradan değiştirdikten sonra:

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

buna:

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

Her şey (değiştirildi çalıştı Modeliçin Models). Bu dizede bu üç yeri değiştirmek zorunda olduğumu unutmayın.


2
Entity Framework modelimi Modelden DAL'a taşıdım. Ama sonra Linq tahmincisini test etmek için test projesinde bir test (bir hafta sonra) yazdığımda. Bu hatayı aldım. App.config test projelerini üç projede söylediğiniz gibi ana projenin web.config biçiminde nasıl düzelttiğini düzelttim. Yani basit cevabın beni yoluna koydu.
Patrik Lindström

Evet teşekkürler - dosya adlarınızı kontrol edin. Bir şekilde eski ismim vardı.
PeterX

7
İkisi arasında bir fark var mı?!
Erwin Rooijakkers

2
@ErwinRooijakkers Model vs ModelS
Marc

Craig'in blogunu okuduktan sonra da aynısını yapmış olduğumu anladım, ancak öğrenme için +1, "varlıklar" sınıf kütüphanenizde yapılan değişikliklerin, referans veren projelerin yapılandırma dosyalarında otomatik olarak yapılmadığını hatırlamak önemlidir. Yalnız olmadığım için mutluyum.
Mart'ta

26

Ve Reflector olmadan model adını kontrol etmenin hızlı bir yolu ... dizini arayın

... obj / {config output} / edmxResourcesToEmbed

ve .csdl, .msl ve .ssdl kaynak dosyalarının bulunduğunu kontrol edin. Bir alt dizinde bulunuyorlarsa, alt dizinin adı model adının başına eklenmelidir.

Örneğin, üç kaynak dosyam bir Veriler alt dizininde , bu nedenle bağlantı dizem

meta veri = res: // * / Veri .MyModel.csdl | res: // * / Veri .MyModel.ssdl | res: // * / Veri .MyModel.msl;

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


Bu TAM benim sorunum oldu. Bu konuda birkaç saat kaybettim. Bu kolay açıklama için çok teşekkür ederim
Fernando Carvalhosa

Harika yanıt, aslında dizenizin ne olduğunu nasıl bulacağınızı açıklar. Ve alt klasörlerin '' olduğunu gösterir. sınırlayıcı olarak '\' veya '/' olarak değil.
cjb110

16

Ben de bu sorunu vardı ve benim web.config benim bağlantıları bağlantıları EDMX bulunduğu montaj app.config birinden biraz farklıydı çünkü. Neden değiştiğine dair bir fikrim yok, ama işte iki farklı versiyon.

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

Ne düzeltildi sadece app.config dizesini kopyalamak (sonunda " App=EntityFramework" istedi " application name=EntityFramework" yerine küçük fark dikkat ) web.config ve sorun çözüldü. :)


1
Teşekkürler, bu gerçekten benim sorunumdu. EF ile DB'ye erişen 1 projem ve başka bir WCF projem vardı. İlk projenin adını değiştirdikten sonra, ilk projemin App.config dosyasında connectionString değiştirildi. İ projede connectionString değiştirmek zorunda Yani WCF :) web.config'de aswell
Volkan'dan

Docs.microsoft.com/en-us/dotnet/framework/data/adonet/… ile ilgili MSDN belgelerinden : 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.Entity Framework bağlantı dizeleri bu esnekliği paylaşmaz, bu nedenle yalnızca beklediği anahtar kelimeleri kullanmanız gerekir.
Suncat2000

13

Yanlışlıkla edmx dosyasının Derleme Eylemi'ni (IDE'deki Özellikler altında görünür) 'EntityDeploy' dan 'None' olarak değiştirdiğimde başıma geldi. EntityDeploy, meta verileri sizin için doldurur: bkz. Http://msdn.microsoft.com/en-us/library/cc982037.aspx


Bu benim düzeltmemdi - kopyaladığımda edmx'imi .old olarak yeniden adlandırdım ve birkaç şeyi deniyordum, daha sonra Build Action'i yeniden adlandırdığımda kendini hiçbirine ayarlamamış ve bu hatayı aldım, EntityDeploy'a geri ayarlandı. benim sorunum :)
eth0

EDMX dosyamı başka bir klasöre taşıdım ve gömülü kaynak adlarının da güncellenmesi için derleme işlemini değiştirmek zorunda kaldım. Teşekkürler!
David

Benim için çözüm buydu; .NET Standard'a yükseltme sürecinde bu ayarı kaybettim. Aklımı kurtardığın için teşekkürler!
NetherGranite

11

Yeni .edmx tasarımcısı oluşturmadan önce çözümü temizlemediğimde bu bana geliyor. Bu nedenle, yeni .edmx tasarımcısı oluşturmadan önce çözümü temizlemeyi unutmayın. Bu, bununla ilgili daha fazla sorunu atlamama yardımcı oluyor. Görsel stüdyoda yeni olmanız durumunda sağlanan navigasyon ayrıntılarının altında.

Tıkla-> Oluştur-> Temiz Çözüm

Sonra tıklayın-> Oluştur-> Çözümü Yeniden Oluştur

Bu yardımcı olur umarım. Herkese teşekkürler


8

Bununla mutlu bir 30 dakika geçirdim. Varlıklar nesnesini yeniden adlandırdım, yapılandırma dosyasındaki girdiyi yeniden adlandırdım, ancak daha fazlası var ... referansı csdl'ye de değiştirmeniz gerekiyor

kaçırmak çok kolay - yeniden adlandırıyorsanız, her şeyi almak emin olun ....


6

Ben de aynı problemi yaşadım. Reflektör ile benim uyduğum dll içine baktı ve kaynak adının doğru olmadığını gördüm. Yeniden adlandırdım ve şimdi iyi görünüyor.


6

Benim durumum için, edmx dosyasının özellikleri değiştirilerek çözüldü.

  1. Edmx dosyasını açın
  2. EDMX tasarımcısının herhangi bir yerine sağ tıklayın
  3. özellikleri seç
  4. "Meta Veri Artefakt İşlemesi" adı verilen özelliği "Çıktı Montajına Yerleştir" olarak güncelleyin

bu benim için problemi çözdü. Sorun, kapsayıcı meta verileri bulmaya çalıştığında, bulamıyor. sadece aynı montajda yap. edmx dosyalarınız başka bir montajda varsa bu çözüm çalışmaz


+1.000.000 bugün benim için temel sorundu. Ürün ad alanlarının yeniden düzenlenmesi ve montajların birleştirilmesi sancıları.
Mike

6

Bu hatayı bütün gün geçirdim

ile çalışıyorsanız n-tear architecture

veya DataAccessLayer formuyla separate Modelsoluşturmaya çalıştınız EDMX.DomainModelLayer

belki bu hatayı alırsın

  1. İlk sorun giderme adımı emin Bağlantı dizesi yapmaktır webconfig (UILayer)ve appconfig (DataAccessLayer)aynı
  2. İkincisi çok önemli connection string

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

    problem hangisi

dünyanın neresinden bulduğumdan Modelveya bağlantı dizemdeki herhangi bir .csdl'den

İşte ben çözümümüz resme bak

resim açıklamasını buraya girin

umarım sana yardım eder


5

Bunu Visual Studio 2010, VB.net (ASP.NET) 4.0'da çözebildim.

Varlık modeli sihirbazı sırasında varlık bağlantı dizesini görebilirsiniz. Buradan bağlantı dizenize kopyalayıp yapıştırabilirsiniz.

Eksik olan tek şey "App_Code" idi. Bağlantılar dizesinde.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"

Ne yazık ki, sihirbazdaki bağlantı dizesi app.config için doğru değil. @leqid, modele giden yolu düzeltmek için iyi bir yol önerdi.
Der_Meister

5

Saatler süren googling ve çözmeye çalıştıktan sonra önerilen çözümlerin hiçbiri işe yaramadı. Burada birkaç çözüm listeledim. Benim için çalışanı da not ettim. (EF 6.1.1 sürümünü ve SQL server 2014'ü kullanıyordum - ancak eski bir DB'yi kullanıyordum)

  1. Projeyi yeniden oluşturup tekrar deneyin.
  2. VS'yi kapatıp aç - Bunun nasıl çalıştığını bilmiyorum
  3. .EDMX dosyasını bir Dizin içine yerleştirdiyseniz, Dizinleri ConnectionString'inize eklediğinizden emin olun. örneğin benimki DAL klasörünün içindedir. SO şuna benziyor: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(bunlar dosyalar. Onları görmek için ~ / obj / .. dizini altındaki tüm çözümlerini Show Explorer'da gösterebilirsiniz)

... ve daha pek çok şey denediğim gibi [EntityFramework sürümünü daha sonraki bir sürüme geri döndürmek gibi (bundan emin değilim]]


benim için ne işe yaradı:

bu makaleden , sorunumu çözmeme yardımcı oldu. Sadece değişti ProviderManifestToken="2012"To ProviderManifestToken="2008"EDMX dosyasında. Bunu yapmak için:

Çözüm Gezgini

  1. .Edmx dosyasına sağ tıklayın
  2. Bununla aç..
  3. Editör XML
  4. 2008 ile ProviderManifestToken = "XXXX" değiştir

Umarım bu yardımcı olur.


Son zamanlarda görünüşte hiçbir değişiklik yaptıktan sonra bu sorunu yaşadım. VS'yi boşuna yeniden başlatmayı denedi, ancak daha sonra temizleme ve yeniden oluşturma ile düzeltildi. Yani, başkalarına, herhangi bir değişiklik yapmadıysanız ve bunların hiçbiri ilgili görünmüyorsa, temiz / yeniden inşa etmeyi deneyin.
Greg

5

Farklı bir projeden edmx kullanıyorsanız, bağlantı dizesinde şunu değiştirin:

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

... için ...

metadata=res://*/DataModel.csdl

Bu doğrudur, yeni proje alt klasörünüze taşımak istiyorsanız, folder.subfolderönce eklemeniz gerekir.
qakmak

Teşekkürler, bu çözüm benim için çalıştı. .Edmx dosyamı bir projedeki bir direkten, başka bir projenin kök dizinine taşıdım ve dir adını çözümümdeki tüm bağlantı dizelerinden kaldırmam gerekiyordu.
Chris

4

Nihai çözüm (veritabanını EDMX ve diğer çeşitli eşyalar üzerinde diğer iki makinede yeniden oluşturduktan sonra bile) Entity Framework'ün ilk baskısını kullanmamaktı. .NET 4.0'da yeniden değerlendirmeyi dört gözle bekliyorum.

Tekrar aynı problemle karşılaşıp bir cevap aradıktan sonra , sonunda aynı problemi yaşayan birini buldum. Bağlantı dizesinin Visual Studio'nun sihirbazı tarafından doğru şekilde oluşturulmadığı ve meta veri kaynaklarına bağlantının önemli bir yolu eksik olduğu anlaşılıyor.

v1.0 HATA ?: Belirtilen meta veri kaynağı yüklenemedi. Scriptler! = Modeller

2013-01-16 Güncellemesi : Neredeyse tamamen EF Code First uygulamalarını (mevcut veritabanlarında bile) kullanmaya geçiş yapan bu sorun artık sorun olmaktan çıkıyor. Benim için bu, otomatik olarak oluşturulan kod ve yapılandırmadaki dağınıklığı azaltmak ve ürün üzerindeki kendi kontrolümü artırmak için uygun bir çözümdü.


4

Sorunum ve çözümüm, belirtiler aynıydı "Belirtilen meta veri kaynağı yüklenemedi", ancak temel neden farklıydı. Çözümde biri EntityModel diğeri çözüm olmak üzere 2 projem vardı. Aslında EntityModel EDMX dosyasını sildim ve yeniden yarattım.

Çözüm, Web Uygulaması projesine geri dönüp bu satırı config dosyasına eklemem gerekti. Yeni model, "diğer" projenin Web.Config dosyasında çoğaltılması gereken birkaç öğeyi değiştirmişti. Eski yapılandırma artık iyi değildi.

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

4

Bazen projemde bu hatayı görüyorum. Bunu çözdüm

1 - EDMX dosyasına sağ tıklayın

2 - Seç Run Custom Toolseçenek

3 - Yeniden inşa projesi


Bu benim için çalıştı ama daha sonra yeniden inşa etmek zorunda kaldım
rdans

3

Benim durumumda, bu sorun modelimin edmx dosyasını yeniden adlandırmakla ilgiliydi ... csdl / ssdl / msl dosyaları için app.config bağlantı dizesini düzeltmek sorunumu düzeltti.

Csdl / ssdl / msl dosyanızı oluşturmak için EF 4.0 tasarımcısı kullanıyorsanız, bu 3 "dosya" aslında modelin ana edmx dosyasında saklanır. Bu durumda, Waqas'ın gönderisi hemen hemen işaret üzerindedir. Örneğindeki "Model_Name" ifadesinin, modelinizin .edmx dosyasının (.edmx olmadan) geçerli adı ne olursa olsun değiştirilmesi gerektiğini anlamak önemlidir.

Ayrıca, edmx dosyanız projenizin kök düzeyinde değilse, Model_Name öğesini göreceli yolla önceden girmeniz gerekir;

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

csdl / ssdl / msl xml 'MyModel' adlı bir klasörde saklanan 'WidgetModel.edmx' model dosyasında saklanır.


3

Bu yardımcı sınıfı, kullanarak projeden farklı bir projede tanımlandığında ObjectContext nesnelerinin örnekleri oluşturmak için yazdım. Yapılandırma dosyasındaki bağlantı dizesini ayrıştırıyorum ve '*' yerine tam derleme adını kullanıyorum.

Mükemmel değil çünkü nesneyi oluşturmak için yansıma kullanıyor, ancak bulabildiğim en genel yol.

Umarım birine yardımcı olur.

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

3

Hepiniz SelftrackingEntitiesKullanıcılar için, Microsoft Walk-through'ı izlediyseniz ve Object bağlam sınıfını wcf hizmet projesine ayırdıysanız (.tt bağlamına bağlanarak) bu yanıt tam size göre:

bu yayında gösterilen cevapların aşağıdaki kodu içeren kısmı:

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

SİZİN İÇİN ÇALIŞMAYACAK !! nedeni YourObjectContextType.Assemblyşimdi farklı bir Assembley'de (wcf proje montajının içinde) bulunması,

Bu yüzden YourObjectContextType.Assembly.FullName -> ile değiştirmelisiniz

ClassTypeThatResidesInEdmProject.Assembly.FullName 

iyi eğlenceler.


2

Aynı hata iletisiyle ilgili sorunlar yaşıyordum. Sorunum, Visual Studio 2010 kapatılıp yeniden açılarak çözüldü.


2

Aynı sorunu yaşadım çünkü bir toplantıyı yeniden adlandırdım.

Ayrıca proje Properties / AssemblyInfo.cs içinde AssemblyTitle ve AssemblyProduct özniteliklerinde yeniden adlandırmak ve ayrıca silme ve edmx dosyasına başvuru ekleyerek gerekiyordu.

Sonra iyi çalıştı.


2

Aynı sorun ile Veritabanı edmx yeniden oluşturdu. Sorunumu çözdü.


2
Ne yazık ki, nedeni değil, semptomu ele alıyor ve tedavi ediyor.
Clarice Bouwer

2

Olmayan mevcut Meta için derleyici işaret yüzden sadece Kopya çünkü İstisna olduğu app.config için connectionstring Web.configConnectionString


1

Ayrıca, mevcut bir .edmx'i yeni bir projeye içe aktarmam dışında, Rick'e göre aynı sorun ve çözüme sahiptim ve taban ad alanı farklı bir alt dizine içe aktarılmasının önemli olmadığı halde, bağlantıyı da güncellemeliydim Web.Config içindeki dize, farklı alt dizin adlarını içerecek şekilde üç yerde bulunur:


1

Çözüm Köküne taşındıklarında (proje konumları nedeniyle Mvc3AppConverter ile şüpheli bir hatanın üstesinden gelmek için) bir Çözüm Klasöründe projeler içeren bir çözümle aynı sorunu yaşadım.

Tüm * proje referansları gerektiğinde yeniden eklendikten sonra derlenen çözüm, web sitesi tetiklendiğinde hata atıldı.

EDMX, taşınan projelerden birinde ('Veri' projesi), ancak elbette Veri projesine referans olmaması, derleme hatasına neden değildi, sadece çalışma zamanı hatasına neden oldu.

Eksik referansı birincil projeye eklemek bu sorunu çözdü, bağlantıyı düzenlemeye gerek yok.

Umarım bunun bir başkasına yardımı olur.


1

Bana gelince, Veri Erişim Katmanı ve Kullanıcı Arayüzü katmanını ayırdım. Yani her katman için varlık bağlantı dizesi var.

Bu iki ayrı bağlantı dizesini aynı olarak değiştirmeden önce, yine de aşağıdaki hatayı buldum.

Unable to load the specified metadata resource

Bu iki katman (DAL, UI) için aynı bağlantı dizgileri olmayı başardım, Mükemmel çalışır.

Benim çözümüm, nerede olduklarına bakılmaksızın tüm bağlantı dizgilerinin aynı olmasını sağlamaktır .


1

Dün bu sorun vardı ve benim hata ayıklama ve SQL Profiler çıktı kodumu bakıyordu.

Bu yazıyı okuyup anlamadan önce anlayamadığım şey, EntityFramework DB'yi çağırırken neden bu hatayı atıyordu. Veritabanı modelinde neyin yanlış olduğunu bulmaya çalışırken SQL Profiler'deki yüzlerce satıra bakıyordum. Beklediğim çağrı gibi bir şey bulamadım ve dürüst olmak gerekirse ne aradığımdan emin değildim.

Bu konumdaysanız, bağlantı dizesini kontrol edin. Tahminim EntityFramework SQL oluşturmadan önce bağlantı dizesinin meta veri bölümünde belirtilen modeli kontrol edecek olmasıdır. Benim durumumda yanlıştı. EntityFramework, DB'ye kadar bile gitmiyordu.

Adların doğru olduğundan emin olun. Bir kez ben bu dizildi var, sonra SQL Profiler içinde ApplicationName 'EntityFramework' olduğu aramalar görüyordum SQL beklenen tabloları çağırıyor.


1

Kötü bir app.config veya web.config dosyası bunu yapabilir .. app.config bağlantı dizesini kullanıcı arayüzümdeki web.config dosyasına kopyaladım ve girdim:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.