您的位置:首页 > 职场人生

Entity Framework – Update Model From Database, Part 1

2008-10-19 10:01 351 查看
[align=center]Entity Framework – Update Model From Database, Part 1[/align]

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 类型的属性列表:



我们也将看到如下的验证错误:
[align=left]“Property ContactTitle is not mapped or used in a condition.”[/align]

向导增加了新的属性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

原文链接:
1. Entity Framework – Update Model From Database, Part 1


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息