Belirtilen adlandırılmış bağlantı, yapılandırmada bulunamadı, EntityClient sağlayıcısıyla kullanılması amaçlanmadı veya geçerli değil


170

Bir varlık çerçeve nesnesim var ve bunu projeme connectionstring eklediğimde app.config, connectionstringbölümüne ekleniyor , ancak yeni oluşturmak entitycontextve kullanmak istediğimde connectionstring, bu hata görünüyor



4
Bağlantı için teşekkürler, Craig. Yine de, bu konu tutmak için oy, çünkü başlık bana MetadataException hata bulmanıza yardımcı oldu.
jp2code

Bu, yapılandırma dosyası bir bağlantı dizesiyle garip bir nedenden dolayı güncellenmediğinde başıma geldi.
P.Brian.Mackey

Yanıtlar:


217

Sorununuzun çözümünüzde birden fazla projeniz olduğundan ve edmxdosyalar dahil olmak üzere varlık çerçeve öğelerinizi içeren sorunun çözümlerin başlangıç ​​projesi DEĞİLDİğinden şüpheleniyorum . Bu durumda, EF app.configprojesinde bağlantı dizesi mevcut olsa bile , CLR bunu çalışma zamanında bulamaz. Örneğin, çözümünüzde bir web siteniz ve bir EF projeniz varsa, bağlantı dizesini EF projelerinden app.configweb sitenize kopyalamanız gerekir web.config. Temel olarak, herhangi bir bağlantı dizesi verisi .Net iş parçacıklarının CLR (yani başlangıç ​​projeniz) tarafından başlatıldığı projenin yapılandırma dosyasında bulunmalıdır. Bu sizin durumunuz değilse, yalnızcaedmxdosyasını açın, yüzeyini sağ tıklayın, özellikleri seçin ve bağlantı dizesini kopyalayın ve app.configBağlantı Dizesi bölümünüze yapıştırın . Bu şekilde, yapılandırmanızda doğru olana sahip olduğunuzdan emin olabilirsiniz.

DÜZENLEME:
Burada ObjectContext Constructor üzerinde Dokümantasyon üzerinde görebileceğiniz gibi , ilk parametre EDM'nizi oluşturduğunuzda oluşturulan kod oluşturan linkstring adıdır. Bir şekilde, bağlantı kurma adınızın adı değişirse, yapmanız gereken tek şey modelinizi sağ tıklayıp "Modeli Veritabanından Güncelle ..." yi seçmek ve ardından bunu yansıtacak şekilde güncelleme ve tasarımcınızı güncellemek için sihirbazı takip etmek değişiklik.


1
merhaba Morteza ve cevabınız için teşekkür ederim, ancak daha önce web.config içinde connectionstring sectin kopyalayın, ancak hata çözülmedi, ancak entitymodel.designer içinde değiştirildiğinde (public EntityContext (): base ("name = EntityContext", EntityContext " )) whit bağlantıları bağlantıları işe yaradı, herhangi bir idae
user421413

1
@Morteza, yürütme derlemesinde app.config bulunmayan projeler için bir çözümünüz var mı? Benim durumumda çağrı yürütülebilir, COM Interop aracılığıyla montaj (varlık nesneleri nerede) çağırır bir VB6 uygulamasıdır.
Bozulabilir Dave

4
çok basit, ama çok sinir bozucu. Oy ver. Yaşasın yığın akışı!
granadaCoder

3
WCF kullanıyorsanız, servis projenize bağlantı dizesini eklemeyi unutmayın
Nathan

1
Teşekkürler Morteza, bana çok zaman kazandırdı!
Chris

32

App.config dosyasındaki bağlantı dizesini web.config dosyasına kopyalamanız veya tüm dosyayı çıktıyı görüntüleyen projeye kopyalamanız gerekir. Çerçeveyi tüketme şartlarından biridir.


1
web.config (ön uç projesinde bulunan) ile aynı bağlantı dizesini (Veri erişim projesinde olduğu gibi) eklemeniz yeterlidir.
Danimarka

@ Musikero31 EF kullanıyorum ve koddaki tüm varlık bağlantı dizelerini tanımlıyorum. Bununla ilgili bir yapılandırmada hiçbir şeyim yok.
Keith Beard

DAL dosyalarını yeni bir projeye kopyaladıktan sonra yukarıdaki hatayı da aldım. Yapılandırma dosyalarına daha yakından baktığımda, bağlantı dizesinin EF ile değiştirildiğini fark ettim. Yeni projeye doğru bağlantı dizesini el ile kopyalayıp yapıştırabildim ve işe yaradı.
Ravi Ram

9

Benim çözümde birden çok proje tarafından kullanılacak bir .dll benim özel veritabanı mantığı koymak çalıştığımda bu sorunla karşılaştı.

.Dll dosyası doğru app.config dosyasına sahip olsa da çalışmadı. Varlık çerçeveleri, .exe uygulamasının app.config dosyasındaki bağlantı bilgilerini istedi. Bilgilerin buraya kopyalanması gayet iyi çalıştı.

Morteza'nın bağlantı dizesini doğrudan .edmx'e yapıştırma çözümü benim için işe yaramadı, çünkü değeri oraya yapıştırmama izin vermedi - tam olarak yapmak istediğim şey buydu.


3
Benim exe dizininde sadece bir app.config (ve bu dizinde tek yapılandırma dosyası vardı) olsa da onu okumaz. MyExe.exe.config dosyasını yeniden adlandırmak zorunda kaldım
Mario

6

Merhaba ben bu sorunu vardı ve bu beni deli ediyordu. Neyse sonunda sorunun ne olduğunu anladım. Yapmanız gereken ilk şey connectionstringsin app.configve web.configaynı olduğundan emin olmaktır . Sonra .edmxtabloları görebilmek için dosyaya çift ​​tıklamanız gerekir . Bir kez u tabloların yakınında herhangi bir yere tıklayın ama tablolara değil ve özelliklere gidin. Açılır listeden ConceptualEntityModelVarlık Kabı Adı'nı seçin ve arayın ve iyi hatırlayın.

Sonra edmx dosyasının tasarımcısına gidin ve kurucuları açın. (tasarımcı edmx dosyasının alt klasörüdür) yapıcıların BASE parametresinde iki parametresi olmalıdır

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

bu onlardan biri. ilk parametre dosyanın içinde bulunduğu proje dosyasının .edmxadına sahip olmalıdır. İkinci parametre, daha önce bahsettiğim özelliklerden varlık konteyneri adının adına sahip olmalıdır. tüm kurucuları aşağıdakilerle düzenlemeyi unutmayın:base("", "")

En azından bu benim sorunumdu ve sorunum böyle çözüldü. Umarım sizinkini bu şekilde çözmeyi başarırsınız.


6

Bu konuda hiç kimsenin örtmediği bir varyasyon vardı.

Birkaç model içeren bir ana projem ve birim testleri içeren bir Test Projem vardı. Test Projesi çalışıyordu, ancak daha sonra OP'de belirtilen hatayla durdu. EDMX dosyasını yeniden adlandırmam veya taşımamamıştım.

Bir çok tavsiye .config dosyalarını karşılaştırmaktan bahsetti, ancak projemde hiç yoktu.

Sonunda, ana projedeki app.config dosyasını test projeme kopyaladım ve işe yaradı. Bu doğru adım mı, yoksa ek modeller eklendiğinde sürdürülebilirlik sorunları mı sunacak, bilmiyorum, ama en azından birim testlerim şimdi tekrar doğru çalışıyor.


Bunu gönderdiğimden beri, muhtemelen başka bir projenin app.config dosyasına bir bağlantı oluşturmanın en iyi olacağını fark ettim. Ancak yine de, diğer yaklaşım, yapılandırma dosyası olmadığında orijinal sorunu düzeltmek için çalışacaktır.
S.Baggy

4

Her ne kadar Murtaza Manavinin' cevabı bu sorunu çözmek gelmez, başka bir çözüm dinamik bağlantı dizesi oluşturmak ve ObjectContext için yapıcı içine geçmektir:

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

Bu, bağlantı dizesi bilgilerinin, en azından benim durumumda arzu edilmeyen başlangıç ​​projenizin app.config dosyasına kopyalanması gereğini ortadan kaldırır.


4

Bağlantı dizesinde öznitelik olarak sağlayıcıAdı = "System.Data.EntityClient" eklemeyi unuttum. Bu, bu hatayla sonuçlandı.

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

onun yerine

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

2

Ben sadece bir uygulama VS2010 Web sitesi kökünden iki düzey IIS oluşturulursa bu hata oluştu bulundu. Neden olduğundan emin değilim, daha fazla araştırma yapmamız gerekecek. Örneğin, uygulamanız bu yolda ise: IIS sitenizde sanal dizininiz /admin/advertiseryoksa hata görünür /admin.

Tek yaptığım hatamda boş bir admindizin .../intepub/wwwrootoluştu.

Yukarıdaki adımı gerçekleştirene kadar hata ayıklamaya başlayamayacağınızı göreceksiniz.

Geçmişte ekibimizde bu sorunu yaşadık, hatırlamak biraz zaman aldı ama tam olarak bu şekilde düzelttik.


1

Daha güzel bir mimari kullanıyorum ve aynı problemi yaşıyorum ama bu bana yardım etsin. Umarım bu sana yardımcı olur. Önce aynı olması connection stringsize librariessen gibi DB erişebileceğiniz app.configve web.config sadece bir aşırı yüklenmiş yapıcı içinde .edmx (Model.context.cs) dosyası ekleyin sonra şimdi iki yapıcı bir varsayılan ve u sadece eklenen diğer bir (sahip olduğum aşırı).

        public YourEntityName(string connString)
            : base(connString)
        {
        }

1

EF ile de çalışmak istemeyen bir sınıf kütüphanem vardı. Ben app.config (ya da sadece connectionstring bölümü) sınıf kütüphanemden exe projesine kopyaladıktan sonra bağlantı iyi çalıştı! Muhtemelen yapılandırma dosyasının exe projesiyle aynı klasörde olması beklenir ve bu nedenle bulunamadı. Sınıf kütüphanesi projesinde bir yapılandırma dosyası kullanıldığında daima dikkatli olun!


0

Şey ... bu sorun da çok basit (aptal) bir nedenden dolayı olabilir ... Başka bir projeden bir dosya kopyaladım ve EntityDataSource üzerindeki ConnectionString'i değiştirmeyi unuttum ... projenin başında olduğum ve oldu giriş sayfasında, ben config bir şey olduğunu düşündüm, ama sadece yanlış bağlantı dize adı (ve DefaultContainerName).

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.