27 Mart 2017 Pazartesi
Twitter

Entity Framework Schema specified is not valid hatası çözümü

Projelerinizde Entity Framework (EF) ü kullanıyorsanız, bu hata mesajını alma olasılığınız her zaman için vardır.

Projelerinizde Entity Framework (EF) ü kullanıyorsanız, aşağıdaki hata mesajını alma olasılığınız her zaman için vardır.

İşin enteresan tarafı, bu hatayı derleme anında ya da projenizi çalıştırdıktan hemen sonra almıyorsunuz. Arada sırada karşınıza çıkıyor, sonra kendiliğinden düzeliyor, sonra yine karşınıza çıkıyor.

Server Error in '/' Application.
--------------------------------------------------------------------------------

Schema specified is not valid. Errors:
MySql.Data.Entity.Properties.SchemaDefinition-6.0.ssdl(4,9) : error 0169: All SSDL artifacts must target the same provider. The ProviderManifestToken '5' is different from '5.1' that was encountered earlier.
MySql.Data.Entity.Properties.SchemaDefinition-5.1.ssdl(4,9) : error 0169: All SSDL artifacts must target the same provider. The ProviderManifestToken '5' is different from '5.1' that was encountered earlier.
MySql.Data.Entity.Properties.SchemaDefinition-5.1.ssdl(7,4) : error 0019: The EntityContainer name must be unique. An EntityContainer with the name 'Schema' is already defined.
MySql.Data.Entity.Properties.SchemaDefinition-5.1.ssdl(357,4) : error 0019: Each type name in a schema must be unique. Type name 'MySqlClient.Table' was already defined.
MySql.Data.Entity.Properties.SchemaDefinition-5.1.ssdl(369,4) : error 0019: Each type name in a schema must be unique. Type name 'MySqlClient.TableColumn' was already defined.
 

Bu hatanın çözümü için ufak bir Google araması yaptığınızda, sorunu ilk yaşayan kişinin kendiniz olmadığınızı göreceksiniz.

Arama sonuçlarında yazanları uygulamaya çalıştığınızda, projenizin çalıştığını göreceksiniz. Ama bir süre sonra aynı hata mesajını alırsanız yine şaşırmayın.

İşte benim çözümüm:

web.config dosyasını açın ve EF Connection Stringinin tanıtıldığı satırı bulun.

<connectionStrings>
  <add name="MyEntities" connectionString="metadata=res://*;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;User Id=root;password=xxxx;Persist Security Info=True;database=mydb;charset='latin5';&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

 Hataya sebep olan tanımlama: metadata=res.//*;

Şimdi yapmanız gereken solution unuza yeni bir Class Library eklemek.

Ben Class Library'me MyEntities adını verdim. İçerisinde otomatik olarak gelen Class1.cs ye ihtiyacımız yok silebilirsiniz.

Şimdi projenize sağ tıklayıp Properties penceresi girin. Assembly Name ve Default Namespace alanlarına örnek olarak kendi adınızı verebilirsiniz.

Projeye sağ tıklayıp Add > New Item'dan ADO.NET Entity Data Model i seçin. (Bu aşamaları detaylı anlatmama gerek yok,  bu yazının konusu değil, o yüzden sonraki aşamaları geçtiğinizi düşünüyorum.)

Projenizi derleyin. Hata olmadığından emin olalım, dahası DLL imiz de oluşsun.

İşin renkli tarafı bundan sonrası;

IL Disassembleri çalıştırın.

IL DASM dan oluşan DLL dosyanızı açın. Manifest e çift tıklayın.

Şu satırları bulun:

.mresource public MyModel.msl
{
// Offset: 0x00000000 Length: 0x000002BF
}
.mresource public MyModel.ssdl
{
// Offset: 0x000002C8 Length: 0x00000320
}
.mresource public MyModel.csdl
{
// Offset: 0x000005F0 Length: 0x00000219
}

Şimdi web.config teki EF tanımlama satırındaki metadata bilgisini şu şekilde değiştirin:

<connectionStrings>
<add name="MyEntities" connectionString="metadata=res://DevrimAltinkurt/MyModel.msl|res://DevrimAltinkurt/MyModel.ssdl|res://DevrimAltinkurt/MyModel.csdl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=111.222.333.444;user id=root;password=xxxxx;persist security info=True;database=mydb;charset='latin5';&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

DevrimAltinkurt/ yerine kendi namespace inizi yazmalısınız tabii ki.

 Bundan sonra bu hata mesajını almayacaksınız.

Herkese kolay gelsin.

 

Değerlendirme

Yazım dilinin sadeliği ve anlaşılabilirliği Puan: 4,83 (2 oy)
Yazıdaki kodların kalitesi Puan: 4,65 (2 oy)
İhtiyaca cevap verme Puan: 4,68 (2 oy)
Tavsiye edilebilirlik Puan: 4,88 (2 oy)
Genel değerlendirme Puan: 4,73 (2 oy)
Puanlamalar 5 üzerindendir.
  • Site Yorumları
  • Facebook Yorumları Facebook Yorumları
Yeni yorum yaz Toplam: 9, Onay bekleyen: 0.
  1. Alipaşa

    Merhabalar, Bende aldım bu hatayı ama hiç böyle atraksiyonlara gerek yok. Projede EdmSchemaAttribute aratın bunu silin ilgili satırı sorununuz düzelecektir.

  2. ekrem

    oldu oldu oldu. güzel oldu ;)

  3. ekrem

    artık nefret ediyorum ama henüz yılmadım

  4. Devrim Altınkurt

    :) dostum,

    ben sitede konu anlatımından çok, direkt sorunların çözümlerini vermeye çalışıyorum.
    nedenleriyle nasıllarıyla fazla ilgilenmiyorum.

    o yüzden bazen böyle atlamalar oluyordur, üzgünüm. yazdığın mesajda da haklılık payın var, kabul.

    senin dediğin konu ile ilgili olarak şunları söyleyebilirim:

    IL DASM de bizim işimizi görecek bilgiler:
    - MyModel.msl
    - MyModel.ssdl
    - MyModel.csdl

    bunları web.config teki connectionString içerisinde uygun yerlere yazıyorum. olay bundan ibaret.

    kolay gelsin :))

    not: bu yazı ile ilgil olarak: bu sorunun çözümünü başka yerde bu kadar rahat da bulamazsın :))

  5. ömer bozdemir

    hocam ellerine sağlık bu kadar kötü anlatılır...çok kopuk IL DASM dan oluşan DLL dosyanızı açın. Manifest e çift tıklayın.

    Şu satırları bulun:
    bulduk sonra?!! biş yapmadan web.confige mi gececez...