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.