[Entity Framework] Dababase First, Model 与 Table 的更新策略

在初次使用EF的Database first时,总感觉能迅速的从Data Table 快速将Entity Model快速建立出来,省去以往还要hard code撰写POCO类的功夫,但数据表设计随着开发而更新了几个版本后,常常发生Model 与 Table对不起来的情况,即便执行了"从数据库更新模型",不是字段没反映出来、就是出现错误消息,常常最后只能选择全部砍掉重练....


在初次使用EF的Database first时,总感觉能迅速的从Data Table 快速将Entity Model快速建立出来,省去以往还要hard code撰写POCO类的功夫,但数据表设计随着开发而更新了几个版本后,常常发生Model 与 Table对不起来的情况,即便执行了"从数据库更新模型",不是字段没反映出来、就是出现错误消息,常常最后只能选择全部砍掉重练。

为了要理解这个问题,我们就先来看一下Entity Framework的设计:

先关注一下图的左侧方,也就是EDM(Entity Data Model)的部分,这边代表的是ORM的骨髓,也就是POCO Model (Conceptual Model) 与实际Data Table(Storage Model)相关设计与Mapping的设定,在Database First中就是以edmx这个xml档来表示。如果我们以xml编辑器来开敋,可以看见Storage Models, Conceptual Models 以及其关联数据(Mappings)均在这个文件中。

借由这三个设定区块可以发现,ORM三者各自被设定在不同的区块下,而当以DB First执行"从数据库更新模型",实际上的行为是

借由外部DB更新EDM中的Storage Model

借由外部DB更新EDM中的Storage Model

借由外部DB更新EDM中的Storage Model” <--很重要, 所以要说三次

如此,针对这样的设计我们可以提出以下问题:

  1. 如果在edmx中删除了某个Property但这个字段实际还是存在于Database中,然后在edmx中执行"从数据库更新模型"后, edmx会不会在次反应出这个字段?
  2. 如果在Database中删除了某个Column,在edmx中执行"从数据库更新模型"后,edmx会不会也一并删除这个字段?
  3. 如果在edmx中更改了某个Property名称,然后在edmx中执行"从数据库更新模型"后, edmx会不会再次把这个Property改为Database中的字段名称?
  4. 如果在Database中更改了某个字段名称,然后在edmx中执行"从数据库更新模型"后, edmx会不会再次把对应Property改为Database中的字段名称?
  5. 如果在edmx新增了一个Property,接着在edmx中执行"从数据库更新模型"后,新的Property在edmx中会不会消失?
  6. 如果在Database新增了一个字段,接着在edmx中执行"从数据库更新模型"后,新的column会不会产生一个property?

本来想要一个一个贴图说明的,但避免文章过于冗长,以下列出解答:

  1. 不会,更新的是Storage Model,而在你的edmx记录的Storage Model中,此字段还是存在。
  2. 会反应出这个现象,接着得到一个Error 11009: Property 'XXX' is not mapped的Error Message。
  3. 不会,你改的是Conceptual Model上的Property,并没有动到Storage Model,而实际上的data table也没有变更,由借此可以达到Property对应到不同名的Column。当我们查看Mapping Detail时,可以发现Model与Data Table对应的真实关系
  4. 不会,EF没办法判别出这是一个rename的情境,所以在你的Model中会留着rename前的property名称,与一个新的Property名称。这时候你可以开启Table Mapping来调整,将正确的property对应到对的table column上,而将多除的一个property删掉。
  5. 不会,更新的是Storage Model,并不是你手动异动的Conceptual Model,所以你手动加的字段还是会存在,只是会得到一个Error 11009: Property 'XXX' is not mapped的错误消息。
  6. ,edmx中的Storage Model并没有这个字段,EF便会把这个字段加入storage model, 由于是新增动作,Conceptual Model及mapping部分也会一并建立。

其实,在了解了Entity Data Model的设计后,就可以知道你的修改动作会造成什么影响,Conceptual Model或Storage Model会不会一并更新,如此也会知道何时该进行手动调整。

参考:

http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx

原文:大专栏  [Entity Framework] Dababase First, Model 与 Table 的更新策略


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11496644.html