none
Entity Framework – Update Model From Database, Part 1 RRS feed

  • 常规讨论

  • 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
     
    原文链接:
    • 已移动 小鱼儿 2009年5月19日 10:19 ([Loc]From:.NET Framework 相关)
    2008年10月19日 2:17

全部回复

  • Entity Framework – Update Model From Database, Part 2
     
    Update Model from Database 是EDM 设计器的一个重要改进功能,支持增加新的数据库表和列,Model能够正确处理类型(Type)和属性(Property)的改名,能够检测继承和映射的改变。这里,我们简要介绍这一功能的使用及其限制。
     
    上一篇文章《Entity Framework – Update Model From Database, Part 1》,链接地址:
     
    接下来再次更新model,这次增加了上述2个新表。Model相关部分的更新如下:


    现在,我们从SupplierContract复制属性到Suppliers类型,并删除 SupplierContracts类型。接着到Suppliers 类型的表映射视图,通过点击<Add a Table or View> 单元,并选择 SupplierContracts,并映射Suppliers类型到SupplierContracts 表。映射视图如下图所示:


    我们特别选中需要手动更改的地方:SuppliercontractID 列必须映射到Suppliers类型的ID属性,这是为了Entity Framework 理解如何构建合适的数据库查询。
     
    接着,我们删除PremiumSuppliers 和Suppliers之间的关联,是PremiumSuppliers继承Suppliers类型。并删除PremiumSuppliers中的PremiumSupplierID属性,因为这个主键现在继承自Suppliers,修复后的映射如下图所示:



    Model相关部分如下图所示:



     
    最后,我们再次更新model,这次model不会发生变化。上述向导分析了映射,同时也注意到2个PK-to-PK的关联替换为:一个为继承关系;另一个映射一个类型到2个数据表。
     
    关于向导限制的最后总结如下:
    1. 当相应的数据库列更新时,不能自动更新类型的属性。
    2. 不能重新添加实体类型(entity types)- 一旦你在model中删除了一个类型,重新添加这一实体类型的方法是手动创建,或者在XML编辑器中手动删除SSDL中相应的XML元素。
    3. 也不能重新恢复属性。
    4. 如果你更改类型的主键,所有当前的关联将丢失它们的identity,且将引入新的关联 – 你需要删除旧的关联。
    5. 不能检测数据库对象的更名 – 更名意味着删除旧的对象,增加新的对象。
     
    除了这些限制外,你也将发现这一新的功能不仅有用,而且适用。期待你的反馈。
     
    英文链接:
    1. ADO.NET team blog, Update Model From DB,

     

     

    2008年10月22日 4:35