【知识积累】Entity Framework学习:POCO延迟加载

2024-08-26 01:38

本文主要是介绍【知识积累】Entity Framework学习:POCO延迟加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

之前在公司做一个石化项目的时候,用到了POCO。以往都是直接用Entity, 通过Mapping映射进行Entity到POCO的转换,转换的POCO实体支持延迟加载,它主要是配合code first使用(Code first则是指我们先定义POCO这样的实体class,然后生成数据库),现在也可以使用 EF Power tools将已经存在的数据库反向生成poco的class。

是什么:

POCO即Plain Old CLR Object 。Entity Framework4.0为实体提供了简单传统的CLR对象支持。实体对象可以独立于EF存在,由此EF更好地支持了测试驱动开发和领域驱动设计。同时,EF仍旧可以帮助跟踪POCO实体的变化,允许延迟加载,也回自动修正对导航属性和外键的改动。

项目实践:

基本实现如下图,相信大家会很有共鸣:


首先是在数据库中执行sql语句进行建表。

<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>-- Create table
create table T_USER
(userid      NVARCHAR2(10) not null,username    NVARCHAR2(50) not null,password    NVARCHAR2(10) not null,contact_tel NUMBER,email       NVARCHAR2(50),create_date TIMESTAMP(6)
)
tablespace SYSTEMpctfree 10pctused 40initrans 1maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);
-- Add comments to the columns 
comment on column T_USER.useridis '用户代码';
comment on column T_USER.usernameis '用户名称';
comment on column T_USER.passwordis '用户密码';
comment on column T_USER.contact_telis '联系电话';
comment on column T_USER.emailis '邮箱';
comment on column T_USER.create_dateis '创建日期';
-- Create/Recreate primary, unique and foreign key constraints 
alter table T_USERadd primary key (USERID)using index tablespace SYSTEMpctfree 10initrans 2maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);</strong></span>

在项目中新建相应的Entity类

<span style="font-family:FangSong_GB2312;font-size:18px;"><strong> public class ApprovalProcess:BaseEntity{/// <summary>/// ID/// </summary>public int ID { get; set; }/// <summary>/// 节点名称/// </summary>public string NodeName { get; set; }/// <summary>/// 计划类型/// </summary>public string PlanType { get; set; }/// <summary>/// 状态ID/// </summary>public int StateID { get; set; }/// <summary>/// 类型ID/// </summary>public int TypeID { get; set; }}</strong></span>

新建相应的POCO类

<span style="font-family:FangSong_GB2312;font-size:18px;"><strong> /// <summary>/// 审批过程表/// </summary>[Class(Table = "t_dps_approvalprocess", OptimisticLock = OptimisticLockMode.Version, DynamicUpdate = false)][Cache(Usage = CacheUsage.ReadWrite)][Serializable]public class ApprovalProcess{[Id(0, TypeType = typeof(int), Name = "ID", UnsavedValue = "0")][Column(1, Name = "id", NotNull = true, SqlType = "number")][Generator(2, Class = "sequence")][Param(3, Name = "sequence", Content = "s_dps_approvalprocess")]public virtual int ID { get; set; }/// <summary>/// 节点名称/// </summary>[Property(Column = "nodename")]public virtual string NodeName { get; set; }/// <summary>/// 计划类型/// </summary>[Property(Column = "plantype")]public virtual string PlanType { get; set; }/// <summary>/// 状态ID/// </summary>[Property(Column = "stateid")]public virtual int StateID { get; set; }/// <summary>/// 种类ID/// </summary>[Property(Column = "typeid")]public virtual int TypeID { get; set; }}</strong></span>
业务逻辑层方法编写(以根据审批人姓名和过程ID查询审批人信息为例)

<span style="font-family:FangSong_GB2312;font-size:18px;"><strong>  public ResultPage<Entity.ApprovalUser> QueryApprovalUserByApprovUserNameAndProcessID(Entity.ApprovalUser param, string approvalusername,int processid){try{var page = new Page<POCO.ApprovalUser>();page.PageCurrent = param.PageIndex;page.PageSize = param.PageSize;page.OrderBy = "ID";var poco = ApproveSettingDAL.QueryApprovalUserByApprovUserNameAndProcessID(page, param, approvalusername.Trim(),processid);var entity = Mapper.Map<IList<POCO.ApprovalUser>, IList<Entity.ApprovalUser>>(poco);return new ResultPage<Entity.ApprovalUser>{total = page.total,data = entity};}catch (Exception ex){throw ex;}}</strong></span>

POCO延迟加载的优势:

1)非常宽容,因为只在需要的时候加载数据,不需要预先计划;

2)可能因为数据访问的延迟而降低性能,考虑到每访问父实体的子实体时,就需要访问数据库。



这篇关于【知识积累】Entity Framework学习:POCO延迟加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107185

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

SpringBoot加载profile全面解析

《SpringBoot加载profile全面解析》SpringBoot的Profile机制通过多配置文件和注解实现环境隔离,支持开发、测试、生产等不同环境的灵活配置切换,无需修改代码,关键点包括配置文... 目录题目详细答案什么是 Profile配置 Profile使用application-{profil

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

解决Entity Framework中自增主键的问题

《解决EntityFramework中自增主键的问题》:本文主要介绍解决EntityFramework中自增主键的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Entity Framework中自增主键问题解决办法1解决办法2解决办法3总结Entity Fram

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和