为什么我不能在Entity Framework 4.0中使用包含Union的View?

Rac*_*hel 3 union entity-framework view

我有一个看起来与此类似的视图:

SELECT Id, Name
FROM Users
UNION ALL
SELECT NULL as [Id], NULL as [Name]
Run Code Online (Sandbox Code Playgroud)

当我尝试在Entity Framework中映射到此视图时,它只是失败了.我没有收到错误,但我的数据存储中不存在该视图.为什么是这样?有办法解决吗?

小智 15

我知道这是一个已经标记为已回答的旧问题,但我想发布一个替代编辑edmx的方法.经过大量谷歌搜索并将我的头发拉了几个小时后,我尝试了不同的选择......

对于视图,EF尝试通过标识不可空和非二进制的列来推断主键(请参阅在未推断密钥时创建实体密钥).

使用用于展平相关数据以进行查找的视图,这可能导致许多列(或错误的列)被推断为键.

对于具有UNION的视图,它可能会导致相反的问题,因为可能没有可以安全地包含为键的真实标识列.

要强制EF将列标识为键,可以使用ISNULL()来确保该值不可为空: ISNULL(column_name, replacement_value)

要强制EF不将列标记为键,可以使用NULLIF()使其可为空: NULLIF(column_name, value_not_equal_to_parameter_1)

如果您需要确保返回一个值,但又不想将其标记为键,我相信COALESCE(column_name, replacement_value)在没有EF标记列作为键的情况下将执行ISNULL的工作

如果确实没有可用的可行列作为主键(如在UNION视图),可以伪造通过使用ISNULL()的ROW_NUMBER()在你的SELECT语句结合的一个非空的PK:SELECT ISNULL(ROW_NUMBER() OVER (ORDER BY sort_criteria), 0) as 'ALIASNAME'

作为替代方案,edmx绝对可以像Marcos Prieto建议的那样直接进行编辑,但是下次运行"从数据库更新模型"时,您可能会有覆盖这些更改的风险.

希望这可以帮助将来遇到这个的人!