随笔 - 150  文章 - 0  评论 - 554  阅读 - 30万

Entity Framework – Update Model From Database, Part 1

Entity Framework – Update Model From Database, Part 1
 
Update Model from Database 是EDM 设计器的一个重要改进功能,支持增加新的数据库表和列,Model能够正确处理类型(Type)和属性(Property)的改名,能够检测继承和映射的改变。这里,我们简要介绍这一功能的使用及其限制。
 
首先,我们使用Northwind 数据库,并添加Products 数据表。


接着,将Products 更名为 Product,并运行Update Model from Database – 该菜单项在Model 设计器的右键菜单中,如下图所示:


Update Model from Database 的界面如下,可以方便增加数据表、视图、存储过程的映射。
 


 
注意上图也提供了Refresh / Delete 页面,其功能分别如下:
Add – 显示数据库中的对象,如表、视图、存储过程,但没有在Model的对象。
Refresh – 显示同时在数据库和Model 中的对象。
Delete – 显示在Model 中的对象,但不存在于数据库。
 
因为向导总是重新生成SSDL – 任何对SSDL 的更改在Refresh的时候将丢失。下面,我们增加Orders, Order_Details, Suppliers 数据表到Model 中:



 
但是,现在我们校验(Valid)Model时,有可能出现如下的验证错误:
"Problem in Mapping Fragment(s) starting at line(s) (110, 176): Non-primary-key column(s) [SupplierID] being mapped in both fragments to different conceptual side properties - data inconsistency is possible because the corresponding conceptual side properties can be independently modified.”
 
Entity Framework 提示Products表中SupplierID列映射了2次。原因是在第一次导入时,仅仅增加了一个表products,因此没有创建关联(association),SupplierID字段表现为一个属性。现在,我们查看Products表和Suppliers表的关联映射,发现关联映射到SupplierID列:



在这种情况,Update Model Wizard 向导也无能为力,因为Update Model的策略是避免删除model的任何部分。因此,我们删除Product 类型的SupplierID属性,这样Model验证通过。
 
接下来,我们修改数据库对象:
1. 在Suppliers 数据表增加IsCurrent 列。
2. 从Suppliers 数据表中删除 ContactTitle列。
一旦完成上述更新后,我们再次更新Model,如下是Suppliers 类型的属性列表:



我们也将看到如下的验证错误:
Property ContactTitle is not mapped or used in a condition.
 
向导增加了新的属性IsCurrent到Suppliers类型中,但是没有删除ContactTitle属性,这是“不删除model元素”的策略。因此,我们需要手动删除ContactTitle属性。
 
下一步数据库更新是演示向导中新的映射分析特性(Mapping Analysis Feature):
1. 增加一个新的Supplier类型的表,命名为PremiumSuppliers,增加2列,如下图所示。
2. 增加SupplierContract 表到数据库中,包含大量的合同文档和额外的元数据。增加3列,如下图所示。
3. 增加上述2个表和Suppliers表之间的PK to PK的约束,主键表为Suppliers表。



欢迎继续访问 -  Entity Framework – Update Model From Database, Part 2
 
原文链接:
 
 

 

posted on   EntLib  阅读(2295)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2008年10月 >
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示