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建议的那样直接进行编辑,但是下次运行"从数据库更新模型"时,您可能会有覆盖这些更改的风险.
希望这可以帮助将来遇到这个的人!
| 归档时间: |
|
| 查看次数: |
4632 次 |
| 最近记录: |