Entity Framework 教程——Entity Framework中的实体类型

Entity Framework中的实体类型 :

在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体。在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种。

POCO Entity (Plain Old CLR Object):

POCO类是不依赖任何框架的类型,如同其他正常的一般类型,我们称之为"Plain Old CLR Objects"(这里不知道怎么翻译,普通的CLR对象?古老的CLR对象?大概意思就是没有什么特殊的对象吧)。

POCO 实体(又名非持久化对象)是又EDM创建出来的支持查询,插入,更新,删除行为的实体类型。下面是一个Student 的 POCO 实体

 1 public class Student
 2 {
 3     public Student()
 4     {
 5         this.Courses = new List<Course>();
 6     }
 7
 8     public int StudentID { get; set; }
 9     public string StudentName { get; set; }
10     public Nullable<int> StandardId { get; set; }
11
12     public Standard Standard { get; set; }
13     public StudentAddress StudentAddress { get; set; }
14     public IList<Course> Courses { get; set; }
15 }
16         

动态代理 (POCO 代理):

动态代理是POCO实体的运行时代理,它看起来先POCO实体的封装类。动态代理实体允许懒加载和自动更改追踪。

POCO实体满足一下的条件即为POCO代理:

  1. POCO类必须被声明为public
  2. POCO类不能为密封类
  3. POCO类不能为抽象类
  4. 每一个导航属性必须被声明为public,virtual
  5. 所有集合属性必须是ICollection<T>类型的
  6. 在context 类中不能将ProxyCreationEnabled 设置成false (默认是true)

下面 Student 的POCO实体满足以上所有条件,那么它将成为动态代理实体。

 1  public class Student
 2         {
 3             public Student()
 4             {
 5                 this.Courses = new HashSet<Course>();
 6             }
 7
 8             public int StudentID { get; set; }
 9             public string StudentName { get; set; }
10             public Nullable<int> StandardId { get; set; }
11
12             public virtual Standard Standard { get; set; }
13             public virtual StudentAddress StudentAddress { get; set; }
14             public virtual ICollection<Course> Courses { get; set; }
15         }

注意 : 默认情况下所有实体都允许动态代理,当然你也可以在context类中禁用它。

context.Configuration.ProxyCreationEnabled = false;

EDM默认创建的都是这类代理实体

在运行时Student的类型会变成System.Data.Entity.DynamicProxies.Student

从动态代理中获取实际的类型 : 

你可以通过ObjectContext.GetObjectType()方法从动态代理中获取实际的类型

实体有两种类型的属性,标量属性和导航属性。

标量属性:

标量属性是实体中包含的实际值。例如,Student 实体中如StudentId 和 StudentName的属性。这些对应Student 表中的列。

导航属性:

导航属性指向其他相关的实体。Student 类中有一个Standard 的导航属性,它使应用程序能通过Student 关系到对应的Standard 实体中。

时间: 2024-10-03 13:10:12

Entity Framework 教程——Entity Framework中的实体类型的相关文章

EF中的实体类型(EF基础系列篇6)

EF中有两种类型的实体:POCO Entity和dynamic proxy entity. POCO Entity (Plain Old CLR Object) POCO class是一个类,它不依赖任何.NET framework的基类,它就像任何其他的普通类一样,这也是为什么被称之为“Plain Old CLR Object”的原因: 这些由实体数据模型生成的POCO实体支持大多数的增删查改的功能.下面是一个Studnet POCO实体: public class Student { pub

《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5  从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数据保存前执行一些操作. 解决方案 假设你有如图7-7所示的模型. 图7-7. 包含实体Technician和ServiceCall的模型 在这个模型中,每个技术员(technician)都有一些业务服务请求(service call),业务服务请求包含联系人姓名,问题.使用代码清单7-4,创建一个扩展方法获取

《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架,它支持3种不同的技术来创建websites(网站)和Web应用:他们分别是,Web Pages,Web Forms,和MVC.虽然MVC是一种非常流行的,有完整的用于软件开发模式理论的技术,但它在ASP.NET中却是一种新的技术. 目前最新的版本是2012年发布的ASP.NET MVC4.自从2008年发布

【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt,见图1.CreatedBy用来存是谁进行了这次更改.CreatedAt用来存什么时间进行了这次更改.但是这种方式只能保存最后一次进行改动的人和时间.中间的改动历史都不能保留.改动前的值也不能保留. 图 1 对于关键的信息系统,例如银行系统,电商系统,公安系统,我们需要保存数据完整的变动信息和历史.这

Entity Framework教程(第二版)

源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,EF6.1已经发布很久,EF7马上就到来.那篇文章已经显得相当过时,这期间园子里出现了很多介绍EF4/5/6版本的精彩文章,我的工作中也没有在持续使用EF,本来也就不准备再写现在这篇文章了.后来看到之前那篇文章还是有很多朋友在评论里给予鼓励,再加上自己确实在使用新版EF的过程中也总结了一些心得,解决了

[转]Entity Framework教程(第二版)

源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,EF6.1已经发布很久,EF7马上就到来.那篇文章已经显得相当过时,这期间园子里出现了很多介绍EF4/5/6版本的精彩文章,我的工作中也没有在持续使用EF,本来也就不准备再写现在这篇文章了.后来看到之前那篇文章还是有很多朋友在评论里给予鼓励,再加上自己确实在使用新版EF的过程中也总结了一些心得,解决了

Entity Framework 教程——概述

Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是entity framework的各个重大版本 版本 功能 EF 3.5 提供database first功能 EF 4.0 POCO( Plain Old CLR Object / POCO )支持,延迟加载,可测试性改进.可自定义代码生成和 Model First 工作流. EF 4.1 在Nug

Entity Framework 教程——安装Entity Framework环境

安装Entity Framework环境 Entity Framework 5.0 API分布在两个地方,一个可在NuGet包管理器中找到,一个存在于.NET framework中..NET framework 4.0/4.5包含EF核心API,通过NuGet包管理器下载的EntityFramework.dll则包含EF5.0的特殊功能. 然而在EF6.0中只需从NuGet包管理器下载EntityFramework.dll,而不依赖于.NET framework. 该基础教程使用EF6.0版本编

利用Entity Framework修改指定字段中的值

利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码: [HttpPost] public ActionResult Edit(Article model) { if (model.Id == 0) { return HttpNotFound(); } using (db) { db.Entry(model).State = EntityState.Modified; db.SaveChanges(); } return RedirectToAct