Golden Basim Ответов: 1

EF6 поставляемое соединение недопустимо, поскольку оно содержит недостаточную информацию о сопоставлении или метаданных.


привет,
на основе мой предыдущий вопрос ответы. и через 2 дня поиска я решаю изменить свой старый подход, который использую для настройки пользовательских параметров подключения.

но у меня все еще есть некоторые проблемы, я предпочел создать отдельный вопрос, потому что я думаю об этом по-другому.

обновление:
я изменил эту линию и теперь проблема была другой
entityBuilder.Metadata = @"res://*/MrSModels.MrSalesModel.csdl|res://*/MrSModels.MrSalesModel.ssdl|res://*/MrSModels.MrSalesModel.msl";


Что я уже пробовал:

я использую эту функцию для построения соединения с сущностью MySQL :
public static EntityConnection buildEntityConnection()
        {
            string mrsales_Coonn = "SERVER=" + server + ";Port=" + port + ";DATABASE=" +
                   database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";" + OPTION + ";" + "charset=" + charset + ";Connect Timeout=1999999;";
            myconn.mrsales_Coonn = mrsales_Coonn;
// Specify the provider name, server and database.
            string providerName = "MySql.Data.MySqlClient";
            
            // Initialize the EntityConnectionStringBuilder.
            EntityConnectionStringBuilder entityBuilder =  new EntityConnectionStringBuilder();

            //Set the provider name.
            entityBuilder.Provider = providerName;

            // Set the provider-specific connection string.
            entityBuilder.ProviderConnectionString = myconn.mrsales_Coonn;

            // Set the Metadata location.
            entityBuilder.Metadata = @"res://*/MrSModels.MrSalesModel.csdl|res://*/MrSModels.MrSalesModel.ssdl|res://*/MrSModels.MrSalesModel.msl";


            EntityConnection conn = new EntityConnection(entityBuilder.ToString());
            return conn;
        }


также я добавил этот код в контекст :
public partial class mrsalesdbEntities : DbContext
    {
        //public mrsalesdbEntities()
        //    : base("name=mrsalesdbEntities")
        //{
        //}


        public mrsalesdbEntities(DbConnection existingConnection, string ConnectionString, bool contextOwnsConnection)
            : base(existingConnection, contextOwnsConnection)
        {
        }


кроме того, я создаю эту функцию, чтобы ее было легко редактировать.
public static mrsalesdbEntities OpenConn()
        {
            mrsalesdbEntities MrSalesContext = new mrsalesdbEntities(myconn.EFConnection, myconn.mrsales_EFCoonn, true);
            return MrSalesContext;
        }




когда мне нужно создать какой-либо запрос, я использую эту строку :
mrsalesdbEntities dbContext = ConnectionTools.OpenConn();



эта работа в запросе и не удалась в другом запросе в той же функции, и я не знаю причин
пример:- эта работа
mrsalesdbEntities db01 = ConnectionTools.OpenConn();

          var test1 = db01.people_data.Find(1).pepole_Name;
          var testcount = db01.people_data.Count();

пример:- это не удалось
mrsalesdbEntities db01 = ConnectionTools.OpenConn();
            var latest = db01.ad_backup_config;
            if (latest.Count() != 0)
            {
                DateTime BKDate = Convert.ToDateTime( latest.OrderByDescending(m=> m.backup_ID).FirstOrDefault().backup_Date);
                if (DateTime.Now >= BKDate.AddHours(Convert.ToDouble(SysSettings.BackupPeriod)))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return true;
            }



ошибка :

Поставляемое соединение недопустимо, поскольку оно содержит недостаточную информацию о сопоставлении или метаданных.
Имя параметра: соединение

1 Ответов

Рейтинг:
10

Maciej Los

Я думаю, что никто не сможет вам помочь из-за того, что настройка EF должна выполняться в нескольких местах.

Я бы посоветовал прочитать официальные учебники по MySQL:
MySQL :: MySQL Connector/NET Developer Guide :: 6.6 учебник: использование сущности Entity Framework в качестве источника данных Windows Forms[^]
MySQL :: MySQL Connector/NET руководство разработчика :: поддержка 7.1 Entity Framework 6[^]

Согласно вашему кодексу...

Если нижеприведенная строка отвечает за создание строки подключения, то у вас неприятности!

string mrsales_Coonn = "SERVER=" + server + ";Port=" + port + ";DATABASE=" +
                   database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";" + OPTION + ";" + "charset=" + charset + ";Connect Timeout=1999999;";


Прежде всего: вам следует хранить строку подключения в файле конфигурации , потому что он может измениться несколько раз в процессе разработки.
Второй: не используйте такую конкатенацию строк. Вместо этого используйте его:
string mrsales_Coonn = string.Format("SERVER={0};Port={1};DATABASE={2};UID={3};PASSWORD={4};{5};charset={6};Connect Timeout=1999999;", server, port, database, uid, password, option, charset);

или
string mrsales_Coonn = $"SERVER={server};Port={port};DATABASE={database};UID={uid};PASSWORD={password};{OPTION};charset={charset};Connect Timeout=1999999;";


Как вы можете видеть, рядом нет названия опции OPTION переменная! Это может быть причиной ошибки.

Для получения правильной строки подключения к базе данных MySQL, пожалуйста, смотрите: Строки подключения MySQL - ConnectionStrings.com[^]

Удачи вам!


Golden Basim

привет, да, я обычно использую этот подход, я изменил эту строку, как вы предлагаете :

 string mrsales_Coonn = string.Format("SERVER={0};Port={1};DATABASE={2};UID={3};PASSWORD={4};{5};charset={5};Connect Timeout=1999999;", server, port, database, uid, password, OPTION , charset); 

но похоже, что EntityConnection имеет другой формат, потому что он не может читать "порт","преобразовать нулевую дату-время","кодировку". не могли бы вы подсказать мне, пожалуйста, как написать эту строку подключения?

Golden Basim

привет, да, я обычно использую этот подход, я изменил эту строку, как вы предлагаете :

 string mrsales_Coonn = string.Format("SERVER={0};Port={1};DATABASE={2};UID={3};PASSWORD={4};{5};charset={5};Connect Timeout=1999999;", server, port, database, uid, password, OPTION , charset); 

но похоже, что EntityConnection имеет другой формат, потому что он не может читать "порт","преобразовать нулевую дату-время","кодировку". не могли бы вы подсказать мне, пожалуйста, как написать эту строку подключения?

Maciej Los

Вы не очень внимательно прочитали мой ответ. Как я уже упоминал, вам нужно поместить строку подключения в конфигурационный файл. Затем вы должны прочитать его оттуда.
Я понятия не имею, что вы подразумеваете под "преобразованием нулевой даты-времени".

Golden Basim

я хочу , чтобы пользователь мог изменить соединение с пользовательским интерфейсом, также если строка подключения в файле App.config будет небезопасной и любой разработчик сможет получить доступ к базе данных.

Maciej Los

И вы думаете, что хранение строки подключения в приложении более безопасно? Если да, то вы ошибаетесь.
Вы можете защитить конфигурационный файл, используя один из алгоритмов AES. Видеть: Защита информации о соединении - ADO.NET | Microsoft Docs[^]

Golden Basim

нет, я сохранил его в зашифрованном виде. conn.txt, но все же inscure, потому что он будет загружен в память, поэтому я буду читать эту статью, потому что я предпочитаю помещать строку подключения в конфигурационный файл. , как редактировать строку подключения в конфигурационном файле с кодом во время выполнения ?

Golden Basim

теперь я улучшил свой код , используя файл App.config для хранения соединения, а также зашифровал его, теперь мой код чист ?

public mrsalesdbEntities()
            : base(Functions.ConvertHashToText(ConfigurationManager.ConnectionStrings["mrsalesdbEntities"].ConnectionString))
        {
        }

Maciej Los

Да!