在 WPF 中使用 EF Code First 和 SqlCe

Posted

技术标签:

【中文标题】在 WPF 中使用 EF Code First 和 SqlCe【英文标题】:Using EF Code First and SqlCe in WPF 【发布时间】:2011-01-22 22:42:57 【问题描述】:

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

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

首先,如何设置它以使用 CE 而不是 SqlExpress 并设置文件位置?

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

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

提前致谢。

【问题讨论】:

【参考方案1】:

经过一番折腾,我设法让它工作了。我的 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)。

【讨论】:

我前段时间停止追逐这个,所以没有测试你的解决方案,但由于没有其他人想出任何东西而且你已经有 2 个赞成票,我会接受这个。谢谢,我会在某处记录解决方案,并可能在将来使用它! 对于 Code First,在设置您的程序以便它在您的开发系统上运行之后,app.config 真正需要的只是添加 DbProviderFactories 标记条目。 Code First 会为您完成所有需要的连接字符串。您可能还需要确保 SQLCE DLL(来自 Program Files[x86] 文件夹)与您的程序一起分发。【参考方案2】:

这是一个可能的线索。如果您要使用 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>());
    

【讨论】:

【参考方案3】:

我认为该工具还没有为 WPF 项目的 SQLCE 做好准备。它也阻止了我。

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

WebActivator 自 1.3 版起支持“非网络”场景。您可以手动执行操作(在单元测试中很有用)。

以上是关于在 WPF 中使用 EF Code First 和 SqlCe的主要内容,如果未能解决你的问题,请参考以下文章

ef code first db first 哪种好

在使用 EF 4.1 Code-First 的 Include 和/或 Select 方法时订购导航属性?

EF Core 2.0使用MsSql/Mysql实现DB First和Code First

EF Code First 使用

EF应用一:Code First模式

EF中 Code-First 方式的数据库迁移