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
        {
            public Student()
            {
                this.Courses = new List<Course>();
            }

            public int StudentID { get; set; }
            public string StudentName { get; set; }
            public Nullable<int> StandardId { get; set; }

            public Standard Standard { get; set; }
            public StudentAddress StudentAddress { get; set; }
            public IList<Course> Courses { get; set; }
        }
        

Dynamic Proxy (POCO Proxy):

动态代理是POCO实体运行状态下的代理类,它就像POCO实体的包装类,动态包装实体支持懒加载,自动跟踪改变的特性;

一个POCO实体需要满足下面的条件,才可以成为POCO代理

1.必须定义成Public

2.不能是密封的

3.不能是抽象的;

4.导航属性必须定义成public virtual;

5.每个集合属性必须是Icollection<T>;

6.在context类中,ProxyCreationEnabled 这个选项必须不能是false(默认是true);

下面的POCO Student实体满足了上面的条件,它将会在运行的时候成为动态代理实体;

public class Student
        {
            public Student()
            {
                this.Courses = new HashSet<Course>();
            }

            public int StudentID { get; set; }
            public string StudentName { get; set; }
            public Nullable<int> StandardId { get; set; }

            public virtual Standard Standard { get; set; }
            public virtual StudentAddress StudentAddress { get; set; }
            public virtual ICollection<Course> Courses { get; set; }
        }
        

注意:动态代理默认是对每个实体都是有效的,然而你可以手动禁止动态代理,通过在上下文类中设置ProxyCreationEnabled 这个选项为false,而达到目的;

context.Configuration.ProxyCreationEnabled=false;

在运行的时候Student POCO实体就会变成代理类:

代理类有两个属性,一个标量属性,一个是导航属性,

标量属性实际值包含在实体中,例如Student实体有标量属性StudentID和StudentName,这和数据库中字段一致;

导航属性指向另外相关联的实体,Student实体有一个Standard属性作为导航属性,可以保证程序从一个Student导航到相关联的standard实体。

时间: 2024-08-28 03:30:37

EF中的实体类型(EF基础系列篇6)的相关文章

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对象?大概意思就是没有什么特殊的对象吧). POC

EF6基础系列(五)---EF中的实体关系

这一节将总结EF是怎么管理实体之间的关系.EF与数据库一样支持三种关系类型:①一对一 ,②一对多,③多对多. 下边是一个SchoolDB数据库的实体数据模型,图中包含所有的实体和各个实体间的关系.通过设计器我们很容易看出实体间的对应关系 1.一对一 如上图,Student和StudentAddress具有一对一的关系(零或一).一个学生只能有一个或零个地址.实体框架将Student实体导航属性添加到StudentAddress实体中,将StudentAddress实体导航属性添加到Student

EF框架组件详述(EF基础系列篇3)

我们来看看EF的框架设计吧: EDM(Entity Data Model)[实体数据模型]:实体数据模型包含三个主要部分:概念模型,映射,存储模型: Conceptual Model[概念模型]:包含模型类和类之间的关系.概念模型是独立于数据库设计的: Storage Model[存储模型]:存储模型是数据库设计的实体,它包含数据表,视图,存储过程,还有他们之间的关系和键值: Mapping[映射]:映射包含这个概念模型怎么映射到存储模型的信息: LINQ to Entities:LINQ to

ADO.NET EF 中的实体修改方法

http://www.cnblogs.com/zfz15011/archive/2010/05/30/1747486.html 1.传统修改模式,看下列代码 using (NorthwindEntities context = new NorthwindEntities()){    Region region = context.Region.FirstOrDefault(v => v.RegionID == 4);    region.RegionDescription = "Test

实体之间的关系(EF基础系列篇7)

EF实体之间的关系分为: 1.一对一: 2.一对多: 3.多对多: 一对一关系: Student和StudentAddress之间: public partial class Student { public int StudentID { get; set; } public string StudentName { get; set; } public Nullable<int> StandardID { get; set; } public string RowVersion { get

安装Entity Framework(EF基础系列篇4)

Entity Framework 5.0 API是分布在两个地方:NuGet和.NET Framework中,这个.NET framework 4.0/4.5包含EF核心的API,然而通过NuGet包获取的EntityFramework.dll包含EF 5.0特别的特性:EF6.0中不是分开的: 在这个基础的系列课程中,我将会使用EF 6.0,这个最新的EF版本来学习, 学习EF,首先要安装下面的工具: .NET Framework 4.5 Visual Studio 2012/2013/201

EF开发模式(EF基础系列篇9)

EF有三种开发的模式: 1.Code First 2.Model First 3.Database First Code First:在Code First方法中,你完全避免了直接操作实体设计器(EDMX).我们开始自己写领域类,用这些领域类来生成数据库. Model First:在Model First中,你直接通过实体数据模型(EDMX)创建实体,关系,层级继承,然后根据你的Model生成数据库: Database First:根据已经存在的数据库,然后添加实体数据模型,从数据库中创建生成了

asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)

原文:asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型) 一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent API为属性配置支持字段. 1.1 约定 public class Blog { // _<camel-cased property name> private string _url; public int

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

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