本文主要是介绍【知识积累】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类
业务逻辑层方法编写(以根据审批人姓名和过程ID查询审批人信息为例)<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>
<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延迟加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!