实体框架 4 和 SQL Compact 4:如何生成数据库?

27
我正在使用Entity Framework 4和SQL Compact 4来开发一个应用程序,采用Model First的方法。我已经创建了我的EDM,现在想要生成一个SQL Compact 4.0数据库作为模型的数据存储。我打开“生成数据库向导”,单击“新建连接”按钮以为生成的文件创建连接。出现了“选择数据源”对话框,但在可用数据源列表中没有SQL Compact 4.0:

enter image description here

我正在运行VS 2010 SP1(beta),并安装了VS 2010 Tools for SQL Compact 4.0。我可以从服务器资源管理器中创建SQL Compact 4.0数据连接。只有在“生成数据库向导”中不出现4.0选项。顺便说一下,我的SQL Compact 4.0安装包中包含了“System.Data.SqlServerCe.Entity.dll”,所以我应该拥有需要的SQL Compact组件。

我是做错了什么,还是这是一个错误?有人有解决方法或解决办法吗?谢谢您的帮助。


David,你考虑过使用SQLite而不是CE吗?我发现SQLite更容易使用,并且完全支持EF4。 - Metro Smurf
7个回答

33

为了解决问题,我使用 生成数据库向导 生成一个 SQL Compact 3.5 脚本,并将其运行在在 VS 2010 Solution Explorer 创建的空 SQL Compact 4.0 数据库中。以下是完成此任务的步骤:

步骤1: 运行 生成数据库向导。第一页会提示创建文件,因此请让其创建一个 SQL Compact 3.5 文件。这个文件是虚拟的,所以名称无关紧要。

步骤2: 完成向导以创建将配置新数据库的 DDL 脚本。

步骤3: 删除步骤1创建的虚拟文件。

步骤4: 使用 VS 2010 的 Server Explorer 创建实际的 SQL Compact 4.0 文件,您将在项目中使用该文件。

步骤5: 生成数据库向导 在 EDMX 文件中放置了两个对 SQL Compact "3.5" 的引用;这些引用需要更改为 "4.0"。在 VS 2010 的 XML 编辑器中打开 EDMX 文件(右键单击并选择“打开方式”即可进入 XML 编辑器)。第7行应包含 "3.5" 引用。将它们更改为 "4.0" 并保存文件。

步骤6: 在 VS 2010 中打开生成的 EDMX.SQLCE 脚本文件。VS 将通过工作窗格底部的横幅指示(脚本已断开连接)。在横幅上方的空白处右键单击,并在出现的上下文菜单中选择 连接 > 连接。这将带来一个连接对话框——使用它将脚本连接到您在步骤4中创建的 SQL Compact 4.0 数据库中。

第七步: 再次右键单击脚本空白处,从上下文菜单中选择执行SQL。脚本将被执行,并在脚本下方的窗格中得到通常的结果消息。假设执行成功,则数据库已配置为匹配实体数据模型。

第八步: 我们还需要确保App.config/web.config没有指向虚拟文件。如果是,请将其更改为在上述第4步中创建的实际CE 4.0文件。否则,在我们对模型进行更改时,就会出现重新生成脚本的问题。在配置文件中也将3.5更改为4.0。

此时,您应该能够使用Entity Framework 4来处理您的数据库。


2

回答以下评论并根据它们进行解释:

http://blogs.msdn.com/b/sqlservercompact/archive/2011/01/12/microsoft-sql-server-compact-4-0-is-available-for-download.aspx

这些向导不起作用。

在Visual Studio 2010 SP1 Beta的VB或C# Windows项目中的设计师:以下向导在Windows项目系统中与Compact 4.0不兼容。开发人员可以手动添加对Compact 4.0的ADO.NET提供程序(System.Data.SqlServerCe)的引用,以开发适用于Compact 4.0的程序:

  1. 用于配置数据集的数据源配置向导。
  2. 用于设置使用Sync FX将数据和架构与SQL Server同步的“配置数据配置”向导。
  3. 用于从Compact数据库生成实体的实体数据模型向导。
以下是解决这些问题的可接受方法。 http://erikej.blogspot.com/2010/11/using-entity-framework-with-sql-server.html

谢谢,但我的问题与Entity Framework 4有关。EF4有一个“生成数据库向导”,可以从实体数据模型生成SQL Compact数据库的T-SQL脚本。问题在于,“生成数据库向导”没有显示SQL Compact 4作为生成选项。 - David Veeneman
如果你要使用Transact SQL db脚本CE语法与SQLServer没有区别。你应该能够使用该脚本生成表等内容。我明白你的意思。你尝试过在服务器资源管理器中添加连接吗?并且在建立连接后查看是否会出现?希望我能提供更多帮助。 - Dimentox

1

您可以使用IDatabaseInitializer并在代码中创建数据库

if (File.Exists("Test.sdf"))
    File.Delete("Test.sdf");

string connStr = "Data Source = Test.sdf; Password = <password>";

SqlCeEngine engine = new SqlCeEngine(connStr);
engine.CreateDatabase();
engine.Dispose();

SqlCeConnection conn = null;

try {
    conn = new SqlCeConnection(connStr);
    conn.Open();

    SqlCeCommand cmd = conn.CreateCommand();
    cmd.CommandText = "CREATE TABLE myTable (col1 int, col2 ntext)";
    cmd.ExecuteNonQuery();

catch {
finally {
    conn.Close();

http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlceengine(v=vs.80).aspx


1
据我所知,VS 2010 的当前版本不支持 SQL CE 4.0。它应该包含在 VS 2010 SP1(目前处于测试版)中。请查看this blog post,其中还介绍了如何在 SP1 中使用 EF Model 和 SQL CE 4.0。

编辑:

我找到了这个workaround


1
谢谢,但我已经安装了SP1和VS工具。这篇博客文章并没有真正解决我的问题——它是针对数据库优先和代码优先的,而我正在进行模型优先。 - David Veeneman
我在寻找另一件事情时发现了一些解决方法。我在我的回答中添加了链接。 - Ladislav Mrnka

0

我可以在我的Chinook.Data项目中顺利运行“生成数据库向导”,请确保您的app.config文件中有正确的连接字符串。http://erikej.blogspot.com/2010/11/using-entity-framework-with-sql-server.html

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="ChinookEntities" connectionString="metadata=res://*/ChinookModel.csdl|res://*/ChinookModel.ssdl|res://*/ChinookModel.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=C:\projects\Chinook\Chinook40.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

谢谢,Erik - 当您运行“生成数据库向导”时,是否有SQL Compact 4.0的条目? 向导对我来说可以运行,但它没有显示Ver. 4.0作为选项。 - David Veeneman
我只能得到生成的 DDL 的第二个屏幕,但在第一步中它并没有显示 4.0 连接,这是正确的。你需要将 edmx 移动到 Web 项目中才能在第一步中看到 4.0 连接。 - ErikEJ
我开发了一个解决方法,可以从Entity Framework 4 EDM创建SQL Compact 4.0数据库,而无需使用Web项目。请参见此问题的已接受答案。 - David Veeneman

0

0

如果在安装Visual Studio 2010 SP1时未直接安装,则可能需要安装SQL Server Compact 4工具。当我遇到这个问题时,这是对我有效的解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接