在实体框架中创建上下文时出错

时间:2019-01-05 17:33:53

标签: wpf entity-framework

我正在开发一个WPF应用程序,该应用程序使用Entity Framework v.6和Code First方法来构建和管理在客户端计算机本身上创建的本地数据库。

当我在客户端计算机上安装应用程序并启动它时,上下文尝试创建数据库时收到以下错误:

  

| DataDirectory |的扩展处理连接字符串时失败。确保| DataDirectory |设置为有效的标准路径。

app.config中,我设置了以下实体框架配置:

<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 :(得分:0)

一个疯狂的猜测-如果您使用以下连接字符串怎么办:

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>