"فشل في العثور على أو تحميل مزود بيانات إطار عمل .NET المسجل" مع MySQL + ASP.NET

StackOverflow https://stackoverflow.com/questions/2497302

  •  21-09-2019
  •  | 
  •  

سؤال

كيف نصلح هذا؟ لقد تم معالجة هذا السؤال عدة مرات حول الإنترنت ، لكنه دائمًا حل بديل. قم دائمًا بنسخ mysql.data.dll إلى دليل bin الخاص بك ، أو يوضح صراحة الإصدار الذي تريده. ما هو النهج "المناسب" لاستخدام DBProvDerFactory لـ MySQL مع ASP.NET؟

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

هل كانت مفيدة؟

المحلول

إذا لم يكن التجمع المعني في GAC ، فيجب أن يكون موجودًا في المسار ، أي مجلد Bin. يكون في GAC ، يجب التوقيع على التجمع. أظن أن بناة mysql.data.dll لم يوقعوا على DLL حتى لا تتمكن من وضعه في GAC على الخادم. لذا فإن نسخ DLL هو الحل الخاص بك.

نصائح أخرى

ولاحظ المستخدم سببًا آخر لهذا الخطأ في مؤشر ترابط مماثل هنا لقد قمت بنسخ لصق لإجابة المستخدمين أدناه في حالة تغيير الرابط

لقد رأيت للتو أن سبب هذا الاستثناء في حالتي كان الإصدارات المختلفة بين DLL وإدخال التكوين. لذلك ، في بعض الأحيان ، يختلف DLL الذي لديك بالفعل (إما المثبت بواسطة Nuget أو بطريقة أخرى) عن الإدخال في عقدة App.Config. يمكن العثور على هذا القسم ، إن لم يكن في app.config ، ضمن Windows Microsoft.net Framework64 v4.0.30319 config machine.config والمجلدات القريبة. تغيير الإصدار في الإدخال إلى إصدار DLL حل المشكلة.

هنا كيف حصلت على موصل MySQL للعمل:

في machine.config تحت dbproviderfactories أضف folliwng:

<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />

*لاحظ أن رقم الإصدار و publickeytoken سيكونان مختلفًا اعتمادًا على إصدار موصل MySQL الذي قمت بتثبيته. هذا المثال مخصص لـ V6.7.4.0 و V2.0 DOT Net

COPMER NEXT COPMENT PROGRAM FILES ٪ mysql mysql connector net 6.7.4 Assemblies v2.0 mysql.data.dll to ٪ windows Assembly.

أمل أن هذا يساعد شخصاما :)

طريقة أخرى من خلال رمز بدون app.config: (لا تنسى تعيين إصدار mysql.data الصحيح في هذا الرمز)

  public class MySqlDbConfiguration: DbConfiguration 
{
    public MySqlDbConfiguration()
    {
        SetDefaultConnectionFactory(new MySqlConnectionFactory());
        SetProviderServices(MySqlProviderInvariantName.ProviderName, new MySqlProviderServices());
        RegisterFactoryIfRequired();
    }

    private static void RegisterFactoryIfRequired()
    {
        string dataProvider = @"MySql.Data.MySqlClient";
        string dataProviderDescription = @".Net Framework Data Provider for MySQL";
        string dataProviderName = @"MySQL Data Provider";
        string dataProviderType =
            @"MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d";

        bool addProvider = true;
        var dataSet = ConfigurationManager.GetSection("system.data") as DataSet;
        foreach (DataRow row in dataSet.Tables[0].Rows)
        {
            if ((row["InvariantName"] as string) == dataProvider)
            {
                // it is already in the config, no need to add.
                addProvider = false;
                break;
            }
        }

        if (addProvider)
            dataSet.Tables[0].Rows.Add(dataProviderName, dataProviderDescription, dataProvider, dataProviderType);

        // test it
        var factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top