最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程。所以如果还是用原来EF框架生成ADO.net实体模型的话,不利于修改。

主要是解决以下两个问题:

1、比如前端需要一个值,如果存储过程没有返回,那么在修改存储过程后就得更新实体。很麻烦。

2、前端所需数据类型和返回数据类型不同时直接能映射不需要循环处理。

下面做一个简单的用法介绍(以机场数据为例):

第一个问题:

1、首先用petapoco链接数据库

下载链接:http://pan.baidu.com/s/1dFEfzSd

将文件下载后放在一个文件夹中,然后再这个文件夹中创建一个类文件用于创建与数据链接的桥梁。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using PetaPoco; namespace Entity.Models
{
public class LxaAirportStatistics
{
public static Database Db
{
get
{
if (HttpContext.Current.Items["CurrentDb"] == null)
{
var retval = new Database("AirportEntity");
HttpContext.Current.Items["CurrentDb"] = retval;
return retval;
}
return (Database)HttpContext.Current.Items["CurrentDb"];
}
} }
}

文件中Database的name与web.config中数据库中链接字符串的name一样。

2、现在数据库链接创建好了,就需要创建一个model类用于对数据建立关系。model类字段名称、类型必须和数据库字段名称、类型一致。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Entity
{
public class Airport
{
public string Airport_DM { get; set; }
public int? Area_DM { get; set; }
public string JC { get; set; }
public string QC { get; set; }
public string TestCol { get; set; }
}
}

  至此,数据库链接和对应关系都创建好了。第一个问题已经解决?有人会问怎么就解决了,那么我可以告诉你,现在数据库的存储过程修改后添加了字段或者删除了字段,只需要在对应的model类对应修改就行,不在需要想使用EF框架一样还得重新生成实体。不信你试试。接下来我们解决第二个问题。

第二个问题:

现在数据虽然从数据库拿出来了,但是前端只需要一部分字段,且类型不同怎么办?

1、创建一个和前端需要的数据类型一样的model类,当然名字的和数据库对应的model类型区别开。

 using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; namespace IBLL.Dto
{
public class AirportDto
{
public string Airport_DM { get; set; }
public int? Area_DM { get; set; }
public string JC { get; set; }
public string QC { get; set; }
}
}

2、数据模型映射到前端需要的模型,这就需要AutoMapper

下载地址:http://pan.baidu.com/s/1c2Knjfa

引用了dll文件之后就需要配置Automapper

 using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using IBLL.Dto; namespace BLL.AutoMapper
{
public class AutoMapperConfig
{
public static void Configure()
{
Mapper.Initialize(x =>
{
x.CreateMap<double?, string>().ConvertUsing<DoubleToString>();//将数据模型中double?类型全部转化成string
x.CreateMap<Entity.Airport, AirportDto>(); });
} private class DoubleToString : ITypeConverter<double?, string>
{
public string Convert(double? source, string destination, ResolutionContext context)
{
return source == null ? "" : source?.ToString("0.00").TrimEnd('').TrimEnd('.');
}
}
}
}

我这还封装了一下,也一并分享给大家

 using AutoMapper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; namespace BLL.AutoMapper
{
/// <summary>
/// AutoMapper扩展帮助类
/// </summary>
public static class AutoMapperHelper
{
/// <summary>
/// 类型映射
/// </summary>
public static T MapTo<T>(this object obj)
{
if (obj == null) return default(T); return Mapper.Map<T>(obj);
}
/// <summary>
/// 集合列表类型映射
/// </summary>
public static List<TDestination> MapToList<TDestination>(this IEnumerable source)
{ return Mapper.Map<List<TDestination>>(source);
} }
}

3、规则配置完成,现在就剩最后一步。实现对象的完美转换。

 using IBLL;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using BLL.AutoMapper;
using IBLL.Dto;
using Entity.Models; namespace BLL
{
public class BLLAirport : IAirport
{
//获取所有机场
public List<AirportDto> GetALLAirpotsList()
{
var listAirport = AirportEntity.Db.Fetch<Entity.Airport>("select * from Airports);
return listAirport.MapToList<AirportDto>(); }
}
}

至此数据结果已经转换。两个问题也解决。当然项目结构不是完整的,大家应该看得懂的。具体的文件位置可根据自己的项目结构进行调整。

这仅仅是我在项目中遇到时解决的办法,有什么问题或者有其他的办法请大家多多指教。谢谢!

不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)的更多相关文章

  1. 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)

    释怀我的诺亚尔   不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...

  2. 10.1.翻译系列:EF 6中的实体映射【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/configure-entity-mappings-using-fluent-api.a ...

  3. EF Code First:实体映射,数据迁移,重构(1)

    一.前言 经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也 ...

  4. EF Code First:实体映射,数据迁移,重构

    经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也都依赖于这 ...

  5. EF Code First:实体映射

    二.实体映射 实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射: (一) DataAnnotation DataAnnotation 特性由.NET 3.5 ...

  6. 使用T4模板为EF框架添加数据库实体注释

    网上有一个解决方法如下: http://www.cnblogs.com/stone_w/archive/2012/10/25/2738345.html 不过我试了下没解决太麻烦了 而且一旦EF要重新生 ...

  7. 使用T4模板为EF框架添加数据库实体注释(转)

    1. 下载文件GetSummery.ttinclude2. 把我们下载下来的文件解压,将解压出来的文件放入解决方案中3. 修改下app.config,添加一个连接字符串: <add name=& ...

  8. EF框架step by step(5)—处理实体简单属性

    EF框架会对实体进行跟踪,对实体的每个属性当前值和原始值及其状态进行跟踪,记录.当前值是指实体属性当前的被赋予的值,而原始值是指实体最初从数据库读取或者附加到DbContext时的值. 先通过简单的代 ...

  9. EF框架step by step(7)—Code First DataAnnotations(1)

    Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...

随机推荐

  1. 白话讲session

    什么是session Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待session,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器 ...

  2. Fragment回调接口应用间分享数据

    package com.example.mydemo; import java.util.List; import android.app.Activity; import android.app.A ...

  3. JS Event事件流(冒泡机制、捕获机制、事件绑定)

    1.事件流 事件流:从页面中接收事件的顺序.也就是说当一个事件产生时,这个事件的传播过程,就是事件流. IE的事件流 IE中的事件流叫事件冒泡:事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播 ...

  4. 详细介绍php中的命名空间

    php命名空间的一个最明确的作用是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.上一章节介绍了什么是php命名空间.php官网已很明确的进行了定义并形象化解释,这 ...

  5. 卸载XCode插件的方法

    1.Finder--前往---前往文件夹--输入~/Library/Developer/Xcode/Plug-ins 2.删除要卸载的插件即可.

  6. 移动端页面以rem为单位设置字体大小不生效解决方法

    这个问题在前端H5页面开发可以说是一个老生常谈的问题了.由于以前所有遇到的问题以及解决方法都会以文档的形式记录在电脑里,而非github或者blog,所以现在才一点一滴的整理上来,就当是一个心路历程吧 ...

  7. SQL语句集锦

    -语 句                                功 能 --数据操作 SELECT      --从数据库表中检索数据行和列 INSERT      --向数据库表添加新数据行 ...

  8. 设计模式二:MVC

    先附上部分代码: /* *MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. *Model(模型) - 模型代表一个存取数据的对 ...

  9. FastReport.NET 中使用二维码

    FastReport.net 是一个比较好用的报表控件,在编辑器中编辑以后 可以直接在vs 中引用. 最近在研究fastreport 现在讲解一下 如何使用它的二维码. fastreport 没有单独 ...

  10. linux exec操作文件描述符

    linux每一个打开文件都会关联一个文件描述符,需要的时候我们可以使用exec命令指定一个大于3的数字作为文件 linux默认文件描述符 每打开一个shell就会打开默认的三个文件描述符描0,1,2, ...