5

我正在尝试将 EF Code First 与我的 WPF 应用程序一起使用,其想法是在 AppData/MyApp(如果没有的话)中创建一个 SqlCe Db 并将其与 EF Code First 一起使用。

目前,当我尝试从它应该创建的数据库中读取数据时出现错误,但是当我检查数据库上下文对象时,我看到它正试图在 SqlExpress 中创建它。

首先,如何将其设置为使用 CE 而不是 SqlExpress 并设置文件位置?

我尝试更改 app.config 中的连接字符串,但无法使其正常工作(它没有创建 sdf 文件),而且我不确定如何设置 AppData 文件夹的连接字符串路径,因为它位于用户文件夹中(不是固定的)。

以前从未使用过 SqlCe 或 EF Code First,因此欢迎和感谢任何帮助。

提前致谢。

4

4 回答 4

6

经过一番折腾后,我设法让它工作了。我的 app.config 有以下内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
  </configSections>

  <connectionStrings>
    <add name="Database"
         connectionString="Data Source=Database.sdf"
         providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0"
           invariant="System.Data.SqlServerCe.4.0"
           description=".NET Framework Data Provider for Microsoft SQL Server Compact"
           type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
  </system.data>

</configuration>

在部署方面,将 DbProviderFactory 放入其中也会有所帮助。它将允许用户在不运行安装程序的情况下使用 SQLCE 4(前提是您也提供本机二进制文件,这里有一些信息:http: //erikej.blogspot.com/2011/02/using-sql-server-compact- 40-with.html )。

于 2011-03-03T18:04:22.413 回答
0

这是一个可能的线索。如果您要使用 NuGet 包管理器安装 EFCodeFirst.SqlServerCompact,并查看:Visual Studio 2010\Projects\MyProject\packages\EFCodeFirst.SqlServerCompact.0.8.8482\Content,它会为您的 Web 应用程序执行以下操作:

public static class AppStart_SQLCEEntityFramework {
    public static void Start() {
        DbDatabase.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

        // Sets the default database initialization code for working with Sql Server Compact databases
        // Uncomment this line and replace CONTEXT_NAME with the name of your DbContext if you are 
        // using your DbContext to create and manage your database
        //DbDatabase.SetInitializer(new CreateCeDatabaseIfNotExists<CONTEXT_NAME>());
    }
}
于 2011-03-01T20:30:53.723 回答
0

我认为该工具还没有为 WPF 项目的 SQLCE 做好准备。它也让我停下了脚步。

于 2011-03-02T12:19:57.417 回答
0

这在短期内可能不会有帮助,但我认为从长远来看这将是最好的解决方案。我无法找到其他人在哪里记录了如何执行此操作,所以我想我必须在我去的时候弄清楚,除非有人对使用 SqlCE4、CodeFirst 和创建 NuGet 包有更深入的了解。它。我们需要的是一个 NuGet 包,可以是一个新包,也可以让现有的包足够智能以处理它,它可以将 SqlCE4 和 CodeFirst 添加到 WPF 和/或 WinForms 项目中。

现有的包似乎面向 Web 项目,因为它依赖于 WebActivator。据我所知,在非 Web 项目上安装 WebActivator 确实不合适。我不知道 NuGet 包是否可以检测项目类型并根据该信息执行不同的安装逻辑。对于负责维护 EFCodeFirst.SqlServerCompact 包的人来说,最好是发布非 Web 版本或使现有版本更智能。

在此之前,在我的业余时间我会看看我是否能弄清楚如何去做并创建我自己的。我不能保证需要多长时间,因为我几乎完全不知道创建 NuGet 包。我已经创建了几个非常基本的,但从来没有做过任何高级的东西,比如配置转换之类的。

于 2011-03-08T17:05:52.890 回答