Ошибка при создании контекста в Entity Framework - PullRequest
0 голосов
/ 05 января 2019

Я разрабатываю приложение WPF, которое использует Entity Framework v.6 с подходом Code First для создания и управления локальной базой данных, которая создается на самом клиентском компьютере.

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

Расширение | DataDirectory | не удалось обработать строку подключения. Убедитесь, что | DataDirectory | указан правильный полный путь.

В app.config Я установил следующую конфигурацию Entity Framework:

<entityFramework>
   <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
         <parameter value="mssqllocaldb"/>
      </parameters>
   </defaultConnectionFactory>
   <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
   </providers>
</entityFramework>

Мой контекстный класс содержит следующий код:

class EntityContext : DbContext
{
    public DbSet<Car> Cars { get; set; }
    public DbSet<Trip> Trips { get; set; }
    public DbSet<Volunteer> Volunteers { get; set; }
    public DbSet<Motivation> Motivations { get; set; }
    public DbSet<PaymentType> PaymentTypes { get; set; }

    public EntityContext() : base("StaccoDataBase")
    {
        System.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<EntityContext>());
    }
}

Я попытался исправить проблему, установив |DataDirectory| в App.xaml.cs следующим образом:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.SetData("DataDirectory", Directories.DBDirectory);
}

Но проблема все еще сохраняется.

Буду очень признателен, если кто-нибудь сможет мне помочь.

1 Ответ

0 голосов
/ 06 января 2019

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

Data Source=(LocalDb)\\MSSQLLocalDB; AttachDBFilename=|DataDirectory|StaccoDataBase.mdf; integrated security=SSPI

Во-первых, используйте |DataDirectory| непосредственно в строке подключения (не вводите его с помощью этого вызова string.Format()), а во-вторых, добавьте расширение .mdf к файлу базы данных, который вы хотите прикрепить .

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

public EntityContext() : base("StaccoDataBase")

попытается найти StaccoDataBase в качестве имени строки подключения в вашем конфигурационном файле.

Так что используйте это:

app.config

<configuration>
.....
    <connectionStrings>
        <add name="StaccoDataBase"
             connectionString="Data Source=(LocalDb)\\MSSQLLocalDB;AttachDBFilename=|DataDirectory|StaccoDataBase.mdf; integrated security=SSPI"
             providerName="System.Data.SqlClient" />
    <connectionStrings>   
    .....
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...