【问题标题】:Using EF Code First and SqlCe in WPF在 WPF 中使用 EF Code First 和 SqlCe
【发布时间】: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,因此欢迎和感谢任何帮助。

提前致谢。

【问题讨论】:

    标签: c# wpf sql-server-ce 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 版起支持“非网络”场景。您可以手动执行操作(在单元测试中很有用)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多