在 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 4.1 Code-First 的 Include 和/或 Select 方法时订购导航属性?