Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中首先使用EF代码和SqlCe_C#_Wpf_Sql Server Ce_Ef Code First - Fatal编程技术网

C# 在WPF中首先使用EF代码和SqlCe

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

我试图在我的WPF应用程序中首先使用EF代码,其想法是在AppData/MyApp中创建一个SqlCe Db(如果没有),然后首先将其与EF代码一起使用

当我试图从它应该创建的数据库中读取数据时,它给出了一个错误,但是当我检查db上下文对象时,我看到它正试图在SqlExpress中创建它

首先,如何将其设置为使用CE而不是SqlExpress,并设置文件位置

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

以前从未使用过SqlCe或EF代码,因此欢迎并感谢您的帮助


提前谢谢。

这里有一个可能的线索。如果要使用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]文件夹)与您的程序一起分发。