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

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


因为向导总是重新生成SSDL – 任何对SSDL 的更改在Refresh的时候将丢失。下面,我们增加Orders, Order_Details, Suppliers 数据表到Model 中:




欢迎继续访问 - Entity Framework – Update Model From Database, Part 2。

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

注意上图也提供了Refresh / Delete 页面,其功能分别如下:
Add – 显示数据库中的对象,如表、视图、存储过程,但没有在Model的对象。
Refresh – 显示同时在数据库和Model 中的对象。
Delete – 显示在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。
原文链接:
分类:
ASP.NET/C#/LINQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端