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






4.33/5 (3投票s)
本文介绍了一个实用程序,它修改 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 可能会在不久的将来发布一个错误修复