EF学习杂记34:如何在EF中使用可更新视图
2010-08-31 15:06
253 查看
假设你在数据库中有一个可以更新的视图(如何实现数据库中可更新的视图我还不是很清楚),你准备在EF中使用该视图,当你把这个视图展现在EF可视编辑器中的时候大致是下面这样的:
![](http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/Model_thumb.jpg)
你可以从上面的途中看到,每个属性前面的图表中都有一个锁的标注,这是因为这个实体对象所对应的是数据库中的视图,EF并不知道哪些属性而已作为主键,所以它就假设所有非空属性都作为主键的一个属性。
修正上面的问题 首先要做的是,上面的视图中,我们知道ID是主键,你可以在XML编辑器中打开EDMX文件,同时修改EntityType属性,如下图所示:
![](http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKey_thumb.jpg)
修改<Key>节点中的属性像下面这样:
![](http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKeyUpdated_thumb.jpg)
这里强调一点,你要同时修改EDMX文件中的<edmx:StorageModels> 和<edmx:ConceptualModels>两个节点中的内容,因为要同时让两个模型接受这个变化。
把视图当做表格来对待 这个时候你已经可以很好的利用EF来对Employees进行查询了。
但是EF不允许你对这个实体进行更新操作,常见的方式是通过创建存储过程或者通过数据库自定义函数的方式来进行更新操作。但事实是这个视图已经具有可更新的功能,这很显然不是我们理想的情况。幸运的是,现在有一个变通方案,可以让EF以Table的方式来处理视图。你需要改变EDMX文件中的EntitySet节点来使这个改变生效,如下:
<EntitySet Name="Employees"
EntityType="Tip34Model.Store.Employees"
store:Type="Views"
store:Schema="dbo"
store:Name="Employees">
<DefiningQuery>SELECT
[Employees].[ID] AS [ID],
[Employees].[Firstname] AS [Firstname],
[Employees].[Surname] AS [Surname],
[Employees].[Email] AS [Email]
FROM [dbo].[Employees] AS [Employees]
</DefiningQuery>
</EntitySet>
替换成如下的代码:
<EntitySet Name="Employees"
EntityType="Tip34Model.Store.Employees"
store:Type="Tables"
Schema="dbo" />
现在你可以像处理表格一样处理这里的视图了。
![](http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/Model_thumb.jpg)
你可以从上面的途中看到,每个属性前面的图表中都有一个锁的标注,这是因为这个实体对象所对应的是数据库中的视图,EF并不知道哪些属性而已作为主键,所以它就假设所有非空属性都作为主键的一个属性。
修正上面的问题 首先要做的是,上面的视图中,我们知道ID是主键,你可以在XML编辑器中打开EDMX文件,同时修改EntityType属性,如下图所示:
![](http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKey_thumb.jpg)
修改<Key>节点中的属性像下面这样:
![](http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKeyUpdated_thumb.jpg)
这里强调一点,你要同时修改EDMX文件中的<edmx:StorageModels> 和<edmx:ConceptualModels>两个节点中的内容,因为要同时让两个模型接受这个变化。
把视图当做表格来对待 这个时候你已经可以很好的利用EF来对Employees进行查询了。
但是EF不允许你对这个实体进行更新操作,常见的方式是通过创建存储过程或者通过数据库自定义函数的方式来进行更新操作。但事实是这个视图已经具有可更新的功能,这很显然不是我们理想的情况。幸运的是,现在有一个变通方案,可以让EF以Table的方式来处理视图。你需要改变EDMX文件中的EntitySet节点来使这个改变生效,如下:
<EntitySet Name="Employees"
EntityType="Tip34Model.Store.Employees"
store:Type="Views"
store:Schema="dbo"
store:Name="Employees">
<DefiningQuery>SELECT
[Employees].[ID] AS [ID],
[Employees].[Firstname] AS [Firstname],
[Employees].[Surname] AS [Surname],
[Employees].[Email] AS [Email]
FROM [dbo].[Employees] AS [Employees]
</DefiningQuery>
</EntitySet>
替换成如下的代码:
<EntitySet Name="Employees"
EntityType="Tip34Model.Store.Employees"
store:Type="Tables"
Schema="dbo" />
现在你可以像处理表格一样处理这里的视图了。
相关文章推荐
- EF学习杂记30:如何在EF中使用数据库自定义函数
- EF学习杂记26:如何通过使用Sbub Entity避免不必要的数据库检索
- EF学习杂记38:如何使用CodeOnly with Astoria
- EF学习杂记3:如何及何时使用贪婪加载
- [wxPython学习]使用PubSub机制来更新视图
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- EF学习杂记27:如何实现BeforeSave Validation
- EF学习杂记35:如何编写OfTypeOnly()函数
- wxPython学习]使用PubSub机制来更新视图
- Qt简介以及如何配置Qt使用VS2010进行开发 分类: QT学习实践 2015-05-05 16:02 34人阅读 评论(0) 收藏
- EF学习杂记31:如何在EF查询中引入外部函数
- 如何在网店数据库中使用视图 【数据库高效编程 - 学习笔记 第八章】
- EF学习杂记1:如何在继承类中返回指定的类
- EF学习杂记29:如何避免LazyLoad 或 Load() reader中的问题
- EF学习杂记39:如何重置Relationships
- 如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)
- 如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)
- CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL
- 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取
- 如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)