EF4 生成数据库

Posted

技术标签:

【中文标题】EF4 生成数据库【英文标题】:EF4 Generate Database 【发布时间】:2010-05-06 01:55:52 【问题描述】:

我正在努力寻找最简单的方法来创建一个基本的“模型优先”实体框架示例。但是,我正在努力处理数据库的实际生成,尤其是针对数据库运行 SQL。

工具

Visual Studio 2010 SQL Server 2008 速成版

流程

    新建类项目 将名为“Database1.mdf”的新服务器数据库项 (mdf) 添加到项目中 添加一个空的 ADO.net 实体模型 创建一个简单的实体(Person: Id, Name) 生成脚本,选择 Visual Studio 为我创建的 Database1 连接 右键单击脚本编辑器并选择“执行 SQL...”选项 登录 SQLEXPRESS

这就是说它找不到数据库名称“Database1”的地方。

“问题”是 SQL 服务器没有附加 Database1。我 100% 肯定 Visual Studio 在创建新数据库时用于将数据库附加到 SQLExpress(步骤 2)。这似乎不再是这种情况(甚至 VS2010 的测试版也做到了)。有人可以证实这一点吗?或者告诉我如何做到这一点?

有没有办法可以修改 TSQL 脚本以使用未附加的数据库。即一个文件。

我知道我可以使用 SQL Management Studio 或 sqlcmd 来附加数据库,但我希望避免使用这些解决方案,因为我希望看到只使用 Visual Studio 的最干净的方法。

理想的解决方案(按最喜欢的顺序)

    让 Visual Studio 附加新创建的数据库 修改生成的 SQL 指向文件

提前致谢。

【问题讨论】:

我发誓,从微软的工具来看,你会认为他们希望你的模型基于数据库架构而不是相反。 是的,M$ 似乎非常关注数据库优先方法。查看诸如 DataGrid 之类的东西或 RIA 服务的每个示例。我想“他们终于在模型优先方面有了突破”,但它还不是无缝的。希望时间能让我们到达那里。 【参考方案1】:

我发现始终有效的方法(至少对于 VS 2010 和 SQL Server (2008|2008 R2) Express)是:

    创建 ADO.NET 实体模型 创建 .mdf 数据库,但不要向其中添加任何表 从服务器资源管理器复制连接字符串 -> 修改连接 -> 高级(底行) 在服务器资源管理器中关闭连接 通过“从模型生成数据库”生成 SQL 脚本 在编辑器中打开 SQL 脚本后,单击“连接”,然后转到选项 -> 附加连接参数,并将连接字符串粘贴到此处。我还在连接字符串的末尾添加了“;Database=DATABASENAME;”。 执行 SQL 断开并重新启动 Visual Studio 现在展开 .mdf 文件的树控件后,这些表应该可以在服务器资源管理器中使用。

可能并非所有步骤都是必需的(尤其不是按照上面显示的确切顺序),因为我并没有真正优化流程——如果它有效,请不要修复它。 :-) 一个关键步骤似乎是 #8,即重新启动 Visual Studio,否则服务器资源管理器无法重新打开数据库。

【讨论】:

这里的关键是第 3 步。仅仅输入 AttachDBFilename 对我来说是不够的。谢谢托米! 您能否详细说明第 5 步?我不太确定您指的是哪个选项。 我不再使用 VS2010,现在我在做 EF 工作时使用 Code First,但在 VS2012 中,右键单击 . edmx 模型编辑器。完成向导将为您创建一个用于创建数据库的 SQL 脚本。【参考方案2】:

感谢 HighTechRider,在服务器资源管理器中为 DataConnection 创建的连接字符串确实具有“AttachDBFilename”参数。

但是这个想法让我尝试了别的东西。

按照上面列出的相同步骤,我在登录到 sqlexpress 步骤时做了一些不同的事情。这一次,在Connect to Database Engine 屏幕中,我单击了显示更多选项按钮并转到“附加连接参数”选项卡。

在这里我添加了AttachDBFilename=c:\src\mydatabasehome\Database1.mdf;database=Database1;。注意我使用的是完整路径,而不是AttachDbFilename=|DataDirectory|\Database1.mdf

然后这会毫无问题地对数据库执行我的 sql。

然后我回到服务器资源管理器并扩展我的数据库连接以便我可以看到我的新表,但是连接失败了。经过一番折腾,我发现无论出于何种原因,当我使用“连接到数据库引擎”屏幕连接到 SQLExpress 实例时,我在 AttachDBFilename 中指定的数据库文件实际上建立了永久连接。因此,之前的连接字符串(使用 AttachDBFilename 参数)不再有效,因为该数据库已附加。

所以我删除了该连接并直接创建了一个新连接到 SQLServer,其中有一个名为“database1”的数据库供我选择。

现在我认为一切正常。

这是一个奇怪的过程,对我来说肯定是出乎意料的,所以如果有人想解释发生了什么,我当然会很感激。现在我有办法(即使有点奇怪)做我想做的事,更好的解决方案值得赞赏。

希望这对某人有所帮助。

【讨论】:

连接字符串存储在 App.config 中,可能已在这些步骤之一中更新,使更改看起来“永久”。顺便说一句,不要忘记将答案标记为已接受。【参考方案3】:

您的连接字符串是什么样的?您是否尝试在连接字符串中添加AttachDbFilename

【讨论】:

【参考方案4】:

“附加连接参数”选项卡在哪里?我只有“高级”选项卡,不清楚您在哪里添加了附加语句。

【讨论】:

嗨 Zacho,如果您提供更多信息,我可能会提供帮助,但就目前而言,如果我按照上面列出的步骤操作,我会看到一个带有“选项”按钮的对话框,展开以显示“附加连接参数”选项卡。我正在使用 SQL Server express 2008,如果这有什么不同?

以上是关于EF4 生成数据库的主要内容,如果未能解决你的问题,请参考以下文章

EF4 Code First & SQLCE 4.0 - 生成数据库时出现异常

使用 EF4 的 POCO 模板时“找不到元数据信息”?

EF4.1 - 在单独的构建服务器上使用 TFS 团队构建的预生成视图是不是存在问题?

使用 EF4 和 MySql

仅在 EF4 代码上创建数据库后更改模型

实体框架时间戳生成数据库问题