c# - MetadataException: غير قادر على تحميل مورد البيانات التعريفية المحدد




.net entity-framework (20)

أنا ببساطة لم أشر إلى مكتبة الفئة التي تحتوي على ملف EDMX.

فجأة استمر في الحصول على MetadataException على instantiating فئة ObjectContext إنشاؤها. تبدو سلسلة الاتصال في App.Config صحيحة - لم يتم تغييرها منذ آخر عمل - وقد حاولت إعادة إنشاء نموذج جديد (edmx-file) من قاعدة البيانات الأساسية بدون أي تغيير.

هل لدي احد اى افكار؟

مزيد من التفاصيل: لم أقم بتغيير أي خصائص ، لم أقم بتغيير اسم أي تجميعات الإخراج ، لم أحاول تضمين EDMX في التجميع. لقد انتظرت فقط 10 ساعات من ترك العمل حتى عدت. ثم لم يعد يعمل.

لقد حاولت إعادة إنشاء EDMX. لقد حاولت إعادة إنشاء المشروع. لقد حاولت حتى إعادة إنشاء قاعدة البيانات ، من الصفر. لا حظ ، على الإطلاق.


إذا كنت تستخدم edmx من مشروع مختلف ، ثم في سلسلة الاتصال ، قم بتغيير ...

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

...إلى...

metadata=res://*/DataModel.csdl

بالنسبة إلى جميع مستخدمي SelftrackingEntities ، إذا كنت قد اتبعت Microsoft Walk-through وفصلت فئة سياق الكائن في مشروع خدمة wcf (عن طريق الربط إلى السياق .tt) ، فإن هذه الإجابة لك:

جزء من الإجابات المعروضة في هذه المشاركة والتي تتضمن كودًا مثل:

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

لن تعمل من أجلك !! السبب أن YourObjectContextType.Assembly الآن يتواجد في Assembley مختلف (داخل تجميع مشروع wcf) ،

لذلك يجب عليك استبدال YourObjectContextType.Assembly.FullName بـ ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

إستمتع.


بعد ساعات من googling ومحاولة حل أي من الحلول المقترحة المقترحة عملت. لقد أدرجت العديد من الحلول هنا. لقد لاحظت أيضا تلك التي عملت بالنسبة لي. (كنت أستخدم الإصدار 6.1.1 من EF ، وخادم SQL لعام 2014 - ولكن قاعدة بيانات قديمة)

  1. إعادة بناء المشروع والمحاولة مرة أخرى.
  2. إغلاق وفتح VS - لا أعرف كيف يعمل هذا
  3. تأكد من وضع الملف .EDMX داخل دليل ، تأكد من تضمين الدلائل في سلسلة الاتصال الخاصة بك. على سبيل المثال الألغام داخل مجلد دال. لذا يبدو كالتالي: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl; (هذه لرؤيتها يمكنك تبديل إظهار كافة الملفات في مستكشف الحلول ، تحت الدليل ~ / obj / ..)

... وغيرها الكثير الذي جربته [مثل: إعادة إصدار EntityFramework إلى إصدار لاحق (غير متأكد من ذلك)]

ما الذي نجح لي:

من هذه المقالة هنا ، ساعدني في حل مشكلتي. لقد قمت فقط بتغيير My ProviderManifestToken="2012" إلى ProviderManifestToken="2008" في ملف EDMX. لفعل هذا:

مكتشف الحل

  1. انقر بزر الماوس الأيمن فوق الملف .edmx
  2. مفتوحة مع..
  3. محرر XML
  4. Change ProviderManifestToken = "XXXX" with 2008

أتمنى أن يساعد ذلك.


سبب آخر لهذا الاستثناء عند تضمين جدول مرتبط في ObjectQuery ولكن اكتب في اسم خاصية التنقل غير صحيح.

مثال:

var query = (from x in myDbObjectContext.Table1.Include("FKTableSpelledWrong") select x);

في بعض الأحيان لا يتم تحميل التجميع الذي يحتوي على الطراز:

    [TestMethod]
    public void TestOpenWithConfigurationAfterExplicit()
    {
        String dummy = typeof(MallApp).Assembly.FullName;  
        //force the assembly loaded.
        using (DbContext ctx = new DbContext("name=MyContainer))
        {
        }
    }

يعيش النوع MallApp في نفس التجمع مثل نموذج الكيان. بدون التحميل الواضح ، سيتم طرح System.Data.MetadataException .


قضيت يوم كامل على هذا الخطأ

إذا كنت تعمل مع n-tear architecture

أو حاولت separate Models التي EDMX إنشاؤها بواسطة نموذج EDMX DataAccessLayer إلى DomainModelLayer

ربما سوف تحصل على هذا الخطأ

  1. الخطوة الأولى لاستكشاف الأخطاء وإصلاحها هي التأكد من أن سلسلة الاتصال في webconfig (UILayer) و appconfig (DataAccessLayer) هي نفسها
  2. الثانية التي هي مهمة جدا connection string

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

    وهي مشكلة

من أين على وجه الأرض حصلت على Model أو أيا كان .csdl في سلسلة الاتصال الخاصة بي أين هم

هنا أنا ننظر حلنا في الصورة

آمل أن تساعدك


كان لدي خطأ مماثل. كنت قد أعدت مشروع (قصة طويلة) ، وسحبت كل شيء من المشروع القديم. لم أكن أدرك أن النموذج الخاص بي كان في دليل يسمى 'Model' من قبل ، وكان الآن في دليل يسمى 'Models'. بمجرد أن قمت بتغيير الاتصال في Web.Config الخاص بي من هذا:

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

الى هذا:

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

عملت كل شيء (غيرت Model إلى Models ). لاحظ أنه كان علي تغيير هذه الأماكن الثلاثة في هذه السلسلة.


كان نفس المشكلة لأنني إعادة تسمية التجمع.

اضطررت أيضًا إلى إعادة تسميتها في خصائص AssemblyTitle و AssemblyProduct في خصائص المشروع / AssemblyInfo.cs ، وكذلك حذف الإشارة إلى ملف edmx وإعادة إضافتها.

ثم عملت على ما يرام.


كما أتيحت لي هذه المشكلة وكان ذلك بسبب أن الاتصال في my web.config كان مختلفًا بعض الشيء عن الجهاز الموجود في التطبيق.تم تهيئة التجميع حيث يوجد EDMX. لا فكرة لماذا تغيرت ، ولكن هنا هو نسختين مختلفتين.

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

ما تم إصلاحه ببساطة هو نسخ سلسلة app.config (لاحظ الفرق الصغير في النهاية - بدلاً من " App=EntityFramework " أراد " application name=EntityFramework ") في web.config وتم حل المشكلة. :)


كنت أواجه مشاكل مع رسالة الخطأ هذه. تم حل مشكلتي عن طريق إغلاق وإعادة فتح Visual Studio 2010.


كنت قادرا على حل هذا في Visual Studio 2010 ، VB.net (ASP.NET) 4.0.

أثناء معالج نموذج الكيان ، ستتمكن من رؤية سلسلة اتصال الكيان. من هناك يمكنك نسخ ولصق في سلسلة الاتصال الخاصة بك.

الشيء الوحيد الذي كنت في عداد المفقودين هو "App_Code". في سلسلة الاتصالات.

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

لقد قضيت 30 دقيقة سعيدة مع هذا. أعيد تسمية كائن الكيانات ، أعاد تسمية الإدخال في ملف التهيئة ، ولكن هناك المزيد ... يجب عليك تغيير المرجع إلى csdl

من السهل جدا أن تفوتك - إذا كنت تريد إعادة تسمية ، تأكد من الحصول على كل شيء ....


لقد كتبت فئة المساعد هذه لإنشاء مثيلات لكائنات ObjectContext عندما يتم تعريفها في مشروع مختلف عن المشروع الذي تستخدمه. أنا تحليل سلسلة الاتصال في ملف التكوين واستبدال '*' بواسطة اسم التجميع الكامل.

إنها ليست مثالية لأنها تستخدم التأمل في بناء الجسم ، ولكنها الطريقة الأكثر عمومية للقيام بذلك والتي يمكن أن أجدها.

آمل أن يساعد شخص ما.

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

مع وجود نفس المشكلة أعيد إنشاء edmx من قاعدة البيانات. يحل مشكلتي.


ملف app.config أو web.config سيئ يمكنه القيام بذلك .. لقد قمت بنسخ سلسلة اتصال app.config إلى web.config الخاص بي في واجهة المستخدم الخاصة بي وانتهى بي الأمر بالدخول:

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

هذا التغيير القليل يساعد في هذه المشكلة.

لدي حل مع 3 مشروع.

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

تغيير الى

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

هذا يعني أن التطبيق غير قادر على تحميل EDMX. هناك العديد من الأشياء التي يمكن أن تسبب هذا.

  • ربما تكون قد قمت بتغيير الخاصية MetadataArtifactProcessing الخاصة بالنموذج إلى نسخ إلى دليل الإخراج.
  • قد تكون سلسلة الاتصال خاطئة. أعلم أنك قلت أنك لم تغيره ، ولكن إذا قمت بتغيير أشياء أخرى (على سبيل المثال ، اسم الجمعية) ، فقد يكون الأمر غير صحيح.
  • قد تكون تستخدم مهمة ما بعد الترجمة لتضمين EDMX في التجميع ، والتي لم تعد تعمل لسبب ما.

باختصار ، لا توجد تفاصيل كافية في سؤالك لإعطاء إجابة دقيقة ، ولكن نأمل أن تنقلك هذه الأفكار إلى المسار الصحيح.

تحديث: لقد كتبت مشاركة مدونة بها المزيد من الخطوات الكاملة لاستكشاف الأخطاء وإصلاحها .


وطريقة سريعة للتحقق من اسم الطراز بدون عاكس .... ابحث عن الدليل

... obj / {config output} / edmxResourcesToEmbed

وتحقق من وجود ملفات موارد .csdl و .msl و .ssdl. إذا كانت في دليل فرعي ، فيجب إدراج اسم الدليل الفرعي في اسم الطراز.

على سبيل المثال ، ملفات الموارد الثلاثة الخاصة بي موجودة في دليل فرعي بيانات ، لذا يجب أن تكون سلسلة الاتصال الخاصة بي

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

(مقابل البيانات الوصفية = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl؛).


يمكنك الحصول على هذا الاستثناء عندما يكون Edmx في مشروع واحد وتستخدمه من مشروع آخر.

السبب هو Res://*/ هو uri الذي يشير إلى الموارد في التجميع الحالي. إذا تم تعريف Edm في تجميع مختلف عن التعليمات البرمجية التي تستخدمه ، res: // * / لن تعمل بسبب عدم العثور على المورد.

بدلاً من تحديد "*" ، تحتاج إلى توفير الاسم الكامل للجمعية بدلاً من ذلك (بما في ذلك رمز المفتاح العام). على سبيل المثال:

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

أفضل طريقة لإنشاء سلاسل الاتصال مع 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();
}

إذا كنت لا تزال تواجه الاستثناء ، افتح التجميع في عاكس وتحقق من أسماء الملفات لملفاتك .csdl و .ssdl و .msl. عندما يكون لدى الموارد أسماء مختلفة عن تلك المحددة في قيمة البيانات الوصفية ، فإنها لن تعمل.





ado.net