65.9K
CodeProject 正在变化。 阅读更多。
Home

Entity Framework 4 EDMX 修改器 - 修正 SQL Server 中的默认值

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (3投票s)

2010年6月23日

CPOL

3分钟阅读

viewsIcon

39965

downloadIcon

468

本文介绍了一个实用程序,它修改 EF4 edmx 文件,以便它们支持 SQL Server 的“默认值或绑定”属性。

引言

如果您在使用 Entity Framework 4 和 SQL Server,那么您可能已经遇到了“默认值或绑定”问题,即 EF4 坚持要求提供每个属性,即使您希望由 SQL Server 提供这些值。

此外,我们通常希望在保存实体时获取这些字段的值。 示例情况可能包括

  • 'CreatedDate' 字段,自动记录行的创建时间
  • 'UniqueGUID 标识符',我们希望知道 SQL 分配给刚刚添加的记录的 GUID。 如果我们处理 SQL 中的 NewSequentialId() 函数(我们有一个 GUID 主键在聚集索引上),这一点尤其重要; 我们无法在应用程序中创建这些,因为只有 SQL Server 才能在创建行期间计算下一个值。
  • 其他“标识符”字段,服务器分配下一个顺序号。 在应用程序端创建这些成本高昂,并且由于并发问题而存在风险。

附带的项目提供了一个解决方法; 它修改 EDMX 文件,将 Microsoft 的“StoreGeneratedPattern”属性从概念模型(您在屏幕上编辑的模型)复制到服务器模型(用于创建 SQL DML 语句的模型)。

Using the Code

此代码是一个简单的命令行应用程序,它接受命令行上的 edmx 文件,并将其转换为已更正的文件,将结果文件写入新文件或覆盖提供的文件。

要在 edmx 设计器中标记要作为服务器生成的属性,请将其“StoreGeneratedPattern”设置为“Computed”。
我们假设这会很好地流转,但最初的发行版避免了此过程,这可能是因为它是一个“不完整的解决方案”,正如我在下面解释的那样。

修改 edmx 文件的命令可以放在项目的“预构建”命令行中,但重要的是要记住,EF4 模板在“预构建”命令运行之前会被重建,因此需要单击项目资源管理器上方的“转换所有模板”按钮,或两次构建您的解决方案。

语法如下

EDMXModifier infile.edmx [outfile.edmx] [/identity] 修改 EDMX 文件,扩展标记为“Computed”的表属性,以便在 EF4 将实体写入数据库时忽略它们。
这允许数据库通过“默认值或绑定”属性提供值。
如果指定了 /identity 标志,则标识列将包含在转换中。

设计问题...

重要的是要注意,这些修改并不能完全解决 EF4 中的问题。 SQL Server 中“默认值或绑定”属性的目的是提供一个如果没有提供值时将使用的默认值。 这意味着,如果我们向 EF4 中的实体提供 NULL,它应该将 NULL 写入该数据库字段。

不幸的是,Microsoft 似乎没有将这个重要的状态纳入 EF4,并且通过仅提供字段的“None”、“Computed”和“Identity”属性,我们无法说“我希望这个字段是可选的,如果我不提供任何值,它应该使用来自数据库定义的默认值”。

因此,目前,我们必须将我们想要使用数据库默认值的每个字段视为计算列; 只读,并且如果我们想更新这些值,我们必须在 EF4 设计器中创建第二个实体,或者通过存储过程修改该值。

关注点

此代码使用 System.Xml.Linq 对象执行操作,而不是使用 XSLT,部分原因是涉及复杂的命名空间,但主要是因为调试起来容易得多!

历史

  • v1.0 - 希望是唯一的版本 - Microsoft 可能会在不久的将来发布一个错误修复
© . All rights reserved.