Почему это приложение пытается подключиться к серверу SQL вместо SQLite? - PullRequest
0 голосов
/ 28 мая 2020

Среда : VS2019, .NET 4.8, EF 6, SQLite, WPF App (.NET Framework)

Я следую этому официальному руководству Microsoft , чтобы создайте приложение с первым кодом с именем WPF_EF6 с помощью SQLite. В конфигурации, показанной ниже, я получаю сообщение об ошибке подключения к серверу SQL. Но, как вы можете видеть в файле App.config ниже, здесь нет сервера SQL?

Вопрос : что я могу здесь упустить? И как решить проблему? Приложение компилируется нормально, но выдает эту ошибку времени выполнения. Я понимаю содержание ошибки, но почему он ищет SQL Сервер? Ошибка возникает в первой строке внутри следующего блока using:

using (MathDocsContext db = new MathDocsContext())
{
    db.MyObjs.Add(new MyObj { Author = "Test1 author", Title = "Test1 title"});
    db.SaveChanges();
}

MyDbContex.cs :

namespace WPF_EF6.Model
{
    public class MyDbContex : DbContext
    {
        public MyDbContex() : base("MySQLiteDb")
        {
        }

        public DbSet<MyObj> MyObjs { get; set; }
    }
}

Ошибка :

System.Data.SqlClient.SqlException
  HResult=0x80131904
  Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 50 - Local Database Runtime error occurred. Cannot create an automatic instance. See the Windows Application event log for error details.

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>
    <system.data>
        <DbProviderFactories>
            <remove invariant="System.Data.SQLite.EF6" />
            <add name="SQLite Data Provider (Entity Framework 6)"
                 invariant="System.Data.SQLite.EF6"
                 description=".NET Framework Data Provider for SQLite (Entity Framework 6)"
                 type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
            <remove invariant="System.Data.SQLite" />
            <add name="SQLite Data Provider" invariant="System.Data.SQLite"
                 description=".Net Framework Data Provider for SQLite"
                 type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
        </DbProviderFactories>
    </system.data>
    <connectionStrings>
        <add name="SqlLiteContext" 
             connectionString="Data Source=|DataDirectory|MySQLiteDb.sqlite" 
             providerName="System.Data.SQLite" />
    </connectionStrings>
    <entityFramework>
        <providers>
            <provider invariantName="System.Data.SQLite.EF6"
                      type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
            <provider invariantName="System.Data.SQLite"
                      type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
        </providers>
    </entityFramework>
</configuration>

1 Ответ

0 голосов
/ 28 мая 2020

Строка подстановки DataDirectory существует "из коробки" только для ASP.net веб-приложения. Если вы хотите использовать его внутри WPF - вам нужно установить его так:

AppDomain.CurrentDomain.SetData("DataDirectory", @"C:\Some\Known\Path");

Вот еще SO ссылка и Docs .

...