2011-01-22 76 views
5

我想在我的WPF应用程序中使用EF代码优先,这个想法是在AppData/MyApp中创建一个SqlCe Db(如果没有),并将它与EF一起使用代码第一。在WPF中使用EF代码优先和SqlCe

当我试图从应该创建的数据库读取数据时发生错误,但是当我检查数据库上下文对象时,我发现它试图在SqlExpress中创建它。

首先,我怎样才能将它设置为使用CE而不是SqlExpress并设置文件位置?

我试着改变app.config中的连接字符串,但无法让它工作(它没有创建sdf文件),我也不知道如何设置连接字符串路径到AppData文件夹,因为它在用户文件夹(不固定)。

以前从未与SqlCe或EF代码合作​​过,因此欢迎任何帮助&赞赏。

在此先感谢。

回答

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而无需运行安装程序(只要您提供本地binares,一些信息在这里:http://erikej.blogspot.com/2011/02/using-sql-server-compact-40-with.html)。

+0

前段时间我停止追逐,所以没有测试过你的解决方案,但由于没有人提出任何问题,而你已经有2张选票,我会接受。谢谢你,我会在某处注明解决方案,并且可能在将来使用它! – Tiax 2011-04-20 02:18:13

+0

对于代码首先,在设置好程序后,它可以在你的开发系统上工作,app.config真正需要的就是添加`DbProviderFactories`标签条目。 Code First为您完成所有需要的连接字符串。 您可能还需要确保SQLCE DLL(来自Program Files [x86]文件夹)与您的程序一起分发。 – 2013-12-06 18:33:55

0

这是一个可能的线索。如果您要使用NuGet Package Manager安装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>()); 
    } 
} 
0

我不认为该工具已准备好用于WPF项目的SQLCE。它也阻止了我的脚步。

0

这可能不会在短期内有所帮助,但我认为这将是长期的最佳解决方案。我一直无法找到其他人已经记录了如何做到这一点,所以我想我必须在我去的时候弄清楚,除非有人更熟悉使用SqlCE4,CodeFirst和创建NuGet软件包,否则我会跳到它。我们需要的是一个NuGet包,或者是一个新的包,或者让现有的包足够聪明来处理它,这可以将SqlCE4和CodeFirst添加到WPF和/或WinForms项目中。

现有的软件包似乎面向Web项目,因为它取决于WebActivator。从我所知道的情况来看,在非web项目上安装WebActivator确实不合适。我不知道NuGet包是否可以检测项目类型并根据这些信息执行不同的安装逻辑。无论是谁负责维护EFCodeFirst.SqlServerCompact软件包,都可以释放非Web版本或使现有的版本变得更加智能。

等待着,在我的业余时间,我会看看我是否能够弄清楚如何去做,并创建自己的。我无法承诺它需要多长时间,因为我几乎完全处于黑暗中,无法创建NuGet包。我创建了几个非常基本的,但从未做过任何高级的东西,如配置转换等。