11

I am trying to use linq2db and mysql to connect to my database, so, I have a simple connection like so:

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

    }
}

Which I am trying to use inside my main program to store information and connect to the database like so:

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

Now, my problem is, when I am trying to connect to the database, my pgoram throws an error saying the following:

an attempt to attach an auto-named database for file aspnetdb.mdf failed...

enter image description here

My Tables.cs file exists, as you can see here;

enter image description here

I have the connection in the config file:

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

How can I fix this error so I can connect to my database?

5
  • If you search your project for aspnetdb are there any matches? Commented Dec 11, 2017 at 2:56
  • Can you provide web.config configuration details? Seems that your connection order defaulted to SQL Server instead of MySQL connector. Commented Dec 11, 2017 at 2:57
  • I tried searching aspnetdb, but no matches. I don't have a webconfig file, just the app config: pastebin.com/H9RzZudx Commented Dec 11, 2017 at 3:25
  • .mdf is SQL Server; please change your tags. Commented Dec 14, 2017 at 5:36
  • 3
    @RickJames but OP indeed has intention to connect to mysql. That for some reason program is trying to connect to some mdf is a whole problem (at least I understood like that). Commented Dec 14, 2017 at 6:31

4 Answers 4

2

This is my appconfig.xml in project with 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>

There is no need to implement IConnectionStringSettings and ILinqToDBSettings.

And you post code with two DataContext classes:

  1. DbTwitters : LinqToDB.Data.DataConnection (there you writting classes for settings)

  2. TwitterDB : LinqToDB.Data.DataConnection (on screenshot and in your example linq code)

Which of classnames is right?

UPD. I understand. You are using .Net Core. In ReadMe on https://github.com/linq2db/linq2db there is:

.Net Core

.Net Core does not support System.Configuration so to configure connection strings you should implement ILinqToDBSettings, for example:

... (code)

And later just set:

DataConnection.DefaultSettings = new MySettings();

Did you do this?

Sign up to request clarification or add additional context in comments.

Comments

2
+25

Check your app.config file for a connection string. I am sure the below tag will be present. Remove this and add a setting for 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>

Comments

2

It seems that your application is trying to open/attach aspnetdb.mdf, the default database for using the ASP.NET Application Services. This connection is defined in Machine.config file like this:

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

So, if you fire a clear before adding your connection string, the problem should go away, as it will remove all connection strings defined in inherited config files as in machine.config.

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

  </connectionStrings>

See clear element documentation here

Comments

2

LinqToDB.Data.DataConnection.DefaultSettings = new MySettings();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.