C# 在WPF中首先使用EF代码和SqlCe
我试图在我的WPF应用程序中首先使用EF代码,其想法是在AppData/MyApp中创建一个SqlCe Db(如果没有),然后首先将其与EF代码一起使用 当我试图从它应该创建的数据库中读取数据时,它给出了一个错误,但是当我检查db上下文对象时,我看到它正试图在SqlExpress中创建它 首先,如何将其设置为使用CE而不是SqlExpress,并设置文件位置 我尝试在app.config中更改连接字符串,但无法使其工作(它没有创建sdf文件),而且我不确定如何将连接字符串路径设置为AppData文件夹,因为它位于用户文件夹中(未修复) 以前从未使用过SqlCe或EF代码,因此欢迎并感谢您的帮助C# 在WPF中首先使用EF代码和SqlCe,c#,wpf,sql-server-ce,ef-code-first,C#,Wpf,Sql Server Ce,Ef Code First,我试图在我的WPF应用程序中首先使用EF代码,其想法是在AppData/MyApp中创建一个SqlCe Db(如果没有),然后首先将其与EF代码一起使用 当我试图从它应该创建的数据库中读取数据时,它给出了一个错误,但是当我检查db上下文对象时,我看到它正试图在SqlExpress中创建它 首先,如何将其设置为使用CE而不是SqlExpress,并设置文件位置 我尝试在app.config中更改连接字符串,但无法使其工作(它没有创建sdf文件),而且我不确定如何将连接字符串路径设置为AppData
提前谢谢。这里有一个可能的线索。如果要使用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>());
}
}
公共静态类AppStart\u SQLCEEntityFramework{
公共静态void Start(){
DbDatabase.DefaultConnectionFactory=newsqlceconnectionfactory(“System.Data.SqlServerCe.4.0”);
//设置用于处理Sql Server Compact数据库的默认数据库初始化代码
//如果需要,请取消对此行的注释,并将CONTEXT_NAME替换为DbContext的名称
//使用DbContext创建和管理数据库
//SetInitializer(新的CreateCeDatabaseIfNotExists());
}
}
我认为该工具还没有准备好用于WPF项目的SQLCE。它也让我停住了脚步。经过一番周折,我终于让它工作起来了。My 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>
).这在短期内可能不会有帮助,但我认为从长远来看,这将是最好的解决方案。我还没有找到其他人在哪里记录了如何做到这一点,所以我想我必须在前进的过程中找出答案,除非有人对使用SqlCE4、CodeFirst和创建NuGet包有更深入的了解,我才知道这一点。我们需要的是一个NuGet包,或者是一个新的包,或者是使现有的包足够智能来处理它,它可以将SqlCE4和CodeFirst添加到WPF和/或WinForms项目中
现有的包似乎面向web项目,因为它依赖于WebActivator。据我所知,在非web项目上安装WebActivator确实不合适。我不知道NuGet包是否可以检测项目类型并基于该信息执行不同的安装逻辑。无论谁负责维护EFCodeFirst.SqlServerCompact包,最好发布一个非web版本或使现有版本更智能
在此之前,在我的业余时间,我将看看我是否能想出如何做,并创建自己的。我不能保证需要多长时间,因为我对创建NuGet包几乎一无所知。我已经创建了一些非常基本的功能,但从未做过任何高级的东西,如配置转换等。WebActivator,因为版本1.3支持“非web”方案。您可以手动执行这些操作(在单元测试中很有用)。我不久前就停止了跟踪,所以还没有测试您的解决方案,但由于没有其他人提出任何建议,而且您已经获得了2张赞成票,我将接受这一点。谢谢你,伙计,我会把解决方案记在某个地方,以后可能会用到它!对于Code First,在将程序设置为在开发系统上运行后,app.config真正需要做的就是添加dbProviderFactorys
标记条目。代码首先为您完成所有需要的连接字符串。您可能还需要确保SQLCE DLL(来自Program Files[x86]文件夹)与您的程序一起分发。