Ошибка подключения к базе данных с помощью Linq

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LinqToDB;
using LinqToDB.Configuration;
using LinqToDB.DataProvider;
using MySql.Data.MySqlClient;
using twitter.Properties;
using DataModels;

namespace twitter.classes
{
    class core
    {
        public static string DatabaseHost
        {
            get { return Settings.Default["databasehost"].ToString(); }
            set { Settings.Default["databasehost"] = value; }
        }

        public static string DatabaseUser
        {
            get { return Settings.Default["databaseuser"].ToString(); }
            set { Settings.Default["databaseuser"] = value; }
        }

        public static string DatabaseName
        {
            get { return Settings.Default["databasename"].ToString(); }
            set { Settings.Default["databasename"] = value; }
        }

        public static string DatabasePassword
        {
            get { return Settings.Default["databasepass"].ToString(); }
            set { Settings.Default["databasepass"] = value; }
        }

        public class ConnectionStringSettings : IConnectionStringSettings
        {
            public string ConnectionString { get; set; }
            public string Name { get; set; }
            public string ProviderName { get; set; }
            public bool IsGlobal => false;
        }

        public class MySettings : ILinqToDBSettings
        {
            public IEnumerable<IDataProviderSettings> DataProviders
            {
                get { yield break; }
            }

            public string DefaultConfiguration => "Twitters"; // lets set your configuration as default, so you can call just new DataContext() or new DataConnection()
            public string DefaultDataProvider => ProviderName.MySql; // and set default database type

            private static IDataProvider GetDataProvider()
            {
                return new LinqToDB.DataProvider.MySql.MySqlDataProvider();
            }

            public IEnumerable<IConnectionStringSettings> ConnectionStrings
            {
                get
                {
                    yield return

                        new ConnectionStringSettings
                        {
                            Name = "Twitters", // This is configuration name, you pass it to DataConnection constructor
                            ProviderName = ProviderName.MySql, // here we are setting database we are working with
                            ConnectionString = "server=" + DatabaseHost + "; database=" + DatabaseName + "" + ";user=" + DatabaseUser + "; password=" + DatabasePassword + ";",
                        };
                }
            }
        }

        public class DbTwitters : LinqToDB.Data.DataConnection
        {
            public DbTwitters() : base("Twitters") { }

            public ITable<Account> Accounts { get { return GetTable<Account>(); } }
            public ITable<Favorite> Favorites { get { return GetTable<Favorite>(); } }
            public ITable<Retweet> Retweets { get { return GetTable<Retweet>(); } }

        }

        internal class MySqlDataReader
        {
        }

    }
}

Что я пытаюсь использовать внутри своей основной программы для хранения информации и подключения к базе данных следующим образом:

using (var db = new TwitterDB())
{
    var query = from a in db.Accounts
                select a;

Теперь моя проблема в том, что когда я пытаюсь подключиться к базе данных, мой pgoram выдает сообщение об ошибке:

попытка подключения базы данных с автоименованием для файла aspnetdb.mdf не удалась...

введите описание изображения здесь

Файл My Tables.cs существует, как вы можете видеть здесь;

введите описание изображения здесь

У меня есть соединение в файле конфигурации:

<system.data>
  <DbProviderFactories>
    <remove invariant="MySql.Data.MySqlClient" />
    <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.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
  </DbProviderFactories>
</system.data>

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

Ответ 1

Проверьте файл app.config на строку подключения. Я уверен, что тег ниже будет присутствовать. Удалите это и добавьте параметр для MySQL.

<connectionStrings>
    <add name="xxxxxxxxx" 
         connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|aspnetdb.mdf;"/>
    <remove name="LocalSqlServer"/>
    <add name="LocalSqlServer"
         connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|aspnetdb.mdf;"/>
  </connectionStrings>

Ответ 2

Это мой appconfig.xml в проекте с linq2db.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="linq2db" type="LinqToDB.Configuration.LinqToDBSection, linq2db" requirePermission="false" />
  </configSections>

  <linq2db defaultConfiguration="SQLiteInDir" />

  <connectionStrings>
    <add name="SQLiteInDir"
         connectionString="Data Source=..\..\DataBase\TestDB.sqlite" 
         providerName="SQLite" /> <!--Place your ConnectionString and ProviderName here-->
  </connectionStrings>
</configuration>

Нет необходимости реализовывать IConnectionStringSettings и ILinqToDBSettings.

И вы отправляете код с двумя классами DataContext:

  • DbTwitters: LinqToDB.Data.DataConnection(там вы набираете классы для настроек)

  • TwitterDB: LinqToDB.Data.DataConnection(на скриншоте и в вашем примере кода linq)

Какое из имен классов правильно?

UPD. Я понимаю. Вы используете .Net Core. В ReadMe на https://github.com/linq2db/linq2db есть:

.Net Core

.Net Core не поддерживает System.Configuration, поэтому для настройки строк подключения вы должны реализовать ILinqToDBSettings, например:

... (код)

И позже просто установите:

DataConnection.DefaultSettings = new MySettings();

Вы сделали это?

Ответ 3

Кажется, что ваше приложение пытается открыть /attach aspnetdb.mdf, базу данных по умолчанию для использования приложений ASP.NET Application Services. Это соединение определено в файле Machine.config следующим образом:

<connectionStrings>
  <add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
</connectionStrings>

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

<connectionStrings>
    <clear/>
    <!--Add your connection string to MySql after this line-->

  </connectionStrings>

См. документацию элементов clear здесь