Entity Framework 5/6 中的可更新视图

Posted

技术标签:

【中文标题】Entity Framework 5/6 中的可更新视图【英文标题】:Updatable Views in Entity Framework 5/6 【发布时间】:2013-09-30 07:01:15 【问题描述】:

我有几个可根据http://technet.microsoft.com/en-us/library/ms187956.aspx 更新的视图。

我的所有观点都遵循上述文章中的规范。我已经在 SQL Management Studio 中验证了可以更新、插入和删除视图。

我所做的研究使我有两个选项可以使我的 Entity Framework 5/6 模型中的视图可更新:

    从每个视图中删除标签,但是,任何工作 更新上下文时,在 MyContext.edmx 中完成的操作会被覆盖 数据库。这意味着这个解决方案对我来说不是很可行 项目。

    为每个存储过程添加插入、更新和删除存储过程 在设计器中查看和映射这些。我不是特别喜欢 不得不创建这么多存储过程的想法。

是否有任何简单的方法告诉 EF5 或 EF6 可以添加/更新/删除视图,在运行后续“从数据库更新模型”命令时不会被清除,而无需为每个入口方法编写存储过程(在每个视图上插入、更新、删除)?

【问题讨论】:

【参考方案1】:

我认为您最简单的方法是在 StorageModel 中更改 EntitySet 的定义,告诉它将其视为表,而不是数据库视图。

查看 XML 定义,它在哪里说

<EntitySet Name="Products" store:Type="Views" ..

你把它改成

<EntitySet Name="Products" store:Type="Tables" ..

(注意“产品”只是一个例子) 这应该在您的 .edmx 文件中。 参见第 44 页,Lerman,“Programming Entity Framework”,第 2 版。

希望这会有所帮助。

【讨论】:

看起来你的示例代码可能丢失了,但我确实明白你想说的话。我会考虑你的建议。 我的错 - 我没有注意到 xml 括号会使文本像那样消失。 经过一些测试,这违反了我的一个约束条件,“在运行后续的“从数据库更新模型”命令时不会被清除”。执行更新时,向导认为视图现在是一个表,并请求再次添加我的视图以接收更改。我忽略了请求并运行了更新。之后我收到一条错误消息,指出我的视图(转换为表格)未映射,并且我需要将其映射到的视图现在丢失了。也就是说,在将其从 Views 类型切换到 Tables 之后,我也收到了错误。 请记住 - 在实施 EF 时,您可以采用多种截然不同的方法。例如,“模型优先”或“数据库优先”。我想你已经知道了。当我们朝相反的方向走时,它会发出尖叫声。就个人而言,我喜欢存储过程方法,因为我通常发现这些方法可以显着提高效率,而且您可以在插入之前仔细检查一些参数值。 如果没有正确检测到模型密钥,请不要忘记设置密钥。您可以在link 中查看描述的示例。【参考方案2】:

我认为与其使用 .edmx,不如使用 poco 类并使用 dbcontext 和 modelbuilder 类来映射其非常轻量级的映射,或者每次更新数据库时都不会更新它。它非常高效且可扩展

希望它会有所帮助。

【讨论】:

【参考方案3】:

您可以从视图中获取主键并使用主键执行更新语句。只是一种解决方法。

【讨论】:

以上是关于Entity Framework 5/6 中的可更新视图的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 中的in操作实例

Entity Framework 中的Code First 中引入数据库函数

Entity Framework Core 2.1 中的 ReverseEngineeringGenerator

利用Entity Framework修改指定字段中的值

EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?

Entity Framework学习-实体框架中的code-first迁移