[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 的更新策略

原文地址:https://www.cnblogs.com/chinatrump/p/11496644.html

时间: 2024-08-29 23:16:17

[Entity Framework] Dababase First, Model 与 Table 的更新策略的相关文章

Entity Framework(EF的Model First方法)

EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开发人员以操作对象的方式去操作关系型数据表. 二是为了屏蔽底层不同厂商的数据库,开发人员面向ORM框架编写数据的CRUD(Create,Retrieve,Update,Delete)操作,再由ORM框架将这些操作翻译成不同数据库厂商的语言. 从EF 4.X开始支持三种构建方法:1. Database

关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明

一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载),Explicit Loading(显式加载),其中Lazy Loading和Explicit Loading都是延迟加载. (注:由于Entity Framework版本的不同,以及采用不同的模式(DB First,Model First,Code First)来构建的Entity,最终导致可能自

[转]Creating an Entity Framework Data Model for an ASP.NET MVC Application (1 of 10)

本文转自:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application Creating an Entity Framework Data Model for an ASP.NET MVC Application (1 of 10) By      

MVC5 Entity Framework学习之实现主要的CRUD功能

在上一篇文章中,我们使用Entity Framework 和SQL Server LocalDB创建了一个MVC应用程序,并使用它来存储和显示数据.在这篇文章中,你将对由 MVC框架自己主动创建的CRUD(create, read, update, delete)代码进行改动. 注意:通常我们在控制器和数据訪问层之间创建一个抽象层来实现仓储模式.为了将注意力聚焦在怎样使用实体框架上.这里暂没有使用仓储模式. 在本篇文章中,要创建的web页面: watermark/2/text/aHR0cDovL

Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core

本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core ----------------------------------------------------------------------- What's In This Chapter? Introducing Entity Framework Core 1.0 Using Depe

MVC5 Entity Framework学习之实现基本的CRUD功能

在上一篇文章中,我们使用Entity Framework 和SQL Server LocalDB创建了一个MVC应用程序,并使用它来存储和显示数据.在这篇文章中,你将对由 MVC框架自动创建的CRUD(create, read, update, delete)代码进行修改. 注意:通常我们在控制器和数据访问层之间创建一个抽象层来实现仓储模式,为了将注意力聚焦在如何使用实体框架上,这里暂没有使用仓储模式. 在本篇文章中,要创建的web页面: 1.创建一个Details页面 由框架代码生成的Stud

Solving the Detached Many-to-Many Problem with the Entity Framework

Introduction This article is part of the ongoing series I've been writing recently, but can be read as a standalone article.  I'm going to do a better job of integrating the changes documented here into the ongoing solution I've been building. Howeve

EF简单例子 Entity Framework

管理NuGet程序包,为项目添加Entity Framework 建立模型model对应表的实体 新建一个DBContext的类,继承DbContext DBContext类加上表的属性,有多少个表就写多少个属性 属性的类型用 IDbSet<> 表示 实体写好Id,类型是Guid类型 使用的时候先new一个DBContext类的句柄 使用句柄可以做增删改查等操作 1 public class DBTestContext : DbContext 2 { 3 public IDbSet<Us

MVC5 Entity Framework学习之处理并发

之前你已经学习了如何更新数据,那么在本节你将学习如何在当多个用户在同一时间更新同一实体时处理冲突. 修改与Department实体相关的那些页面以便它们能够i处理并发错误.下面的截图是Index 和Delete页面,以及当出现并发冲突时的错误消息. 并发冲突 当一个用户对实体的数据进行编辑,然后另一个用户在前一个用户将更改写入到数据库之前更新同一实体的数据时将发生并发冲突.如果你没有启用冲突检测,那么最后一次对数据库的更新将会覆盖其他用户对数据库所做的更改.在大部分应用程序中,这种风险是可以接受