接下来放一个用SqlBulkCopy插入数据的例子,运用了泛型委托和反射。就当好好的运用这些知识。

public static void AddEntityByBulk(IList entitys,string TableName) where TEntity : class

{

using (context = new MyDbContext())

{

//接下来就是批量插入

using (var bulkCopy = new SqlBulkCopy((SqlConnection) context.Database.Connection))

{

bulkCopy.BatchSize = entitys.Count;

bulkCopy.DestinationTableName = TableName;

var table = new DataTable();

Type reccordType = typeof (TEntity);//获取模板类型

PropertyInfo[] propertys = reccordType.GetProperties();

foreach (PropertyInfo property in propertys)

{

if (!property.GetGetMethod().IsVirtual)

{

table.Columns.Add(property.Name, property.PropertyType);

}

}

foreach (var entity in entitys)

{

var dr = table.NewRow();

foreach (var property in propertys)

{

if (!property.GetGetMethod().IsVirtual)

dr[property.Name] = property.GetValue(entity,null);

}

table.Rows.Add(dr);

}

if (context.Database.Connection.State != System.Data.ConnectionState.Open)

{

context.Database.Connection.Open();

}

bulkCopy.WriteToServer(table);

context.Database.Connection.Close();

}

}

}

接下来主要是对反射部分的抽与总结​:

1 Type reccordType = typeof (TEntity);

​ 获取模板类型​,无论是泛型还是实体类型,总之先获取他的类型格式,以方便反射内部的属性,字段以及方法。

2 PropertyInfo[] propertys = reccordType.GetProperties();

​获取该类型的所有属性,切记,只是属性(就是后面有get;set;),方法是不会获取到的。这可以更好的操作数据。

3 property.GetGetMethod().IsVirtual​

但是由于codefirst的实体类中的虽然都是属性,但是会存在自定义的类型,即为了标识与其他类的关系,比如一本书只属于一个出版社,那么实体类就会有一个出版社的属性,一个出版社有很多书,那么出版社的实体类就有一个属性标识着很多书的集合,但是这些都是反射所不需要的,幸好在创建这些属性时都是设置为virtual(感谢是这么设置的,不然区分都不容易)​,每个属性都有get和set方法(这两个就当作方法,虽然本来就是方法),要区分他们就可以使用property.GetGetMethod().IsVirtual,这个可以获取所有的get方法,获取set方法,当然也是可以的,只要判断他们是虚方法就好了,然后就可以区别他们了。

4 property.GetValue(entity,null);​

该方法是为了获取​某个实体在该属性下的值,就相当与一行记录的某一列的值,可以这么理解吧。

这只是一个小小封装,有什么更好的意见或者方法大家可以自己尝试尝试哦!!​​

泛型加委托在EF下的操作例子的更多相关文章

  1. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  2. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  3. JVM自定义类加载器加载指定classPath下的所有class及jar

    一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责 ...

  4. 关于有默认值的字段在用EF做插入操作时的思考(续)

    问题描述 今天下午(看现在这时间,应该是昨天下午了哈),园友 choon 写了这样一篇博文<关于有默认值的字段在用EF做插入操作时的思考>. 博文内容主要记录的是 choon 使用 EF ...

  5. 关于有默认值的字段在用EF做插入操作时的思考

    今天在用EF做插入操作的时候发现数据库中一个datetime类型的字段(CreateDate)的值居然全部为null.于是赶紧看表结构发现CreateDate字段居然是允许为空的. 虽然为空,但是设置 ...

  6. EF ( Entity Framework) 操作ArcCataLog 生成的(Sql Server)空间数据库

    因为项目需求,现在需要利用EF 操作由Arccatalog生成的sql server空间数据库..在此之前,一直没有接触过空间数据库,在操作空间数据库时 绕了许多弯... 因此写一篇随笔做一个总结. ...

  7. Android中自定义ListView实现上拉加载更多和下拉刷新

    ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,Gi ...

  8. 大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配

    第十一章 数据结构(下)-集合操作11.1 集合元素的映射-map11.1.1 map 映射函数的操作11.1.2 高阶函数基本使用案例1+案例211.1.3 使用 map 映射函数来解决11.1.4 ...

  9. 滚动到底部加载更多及下拉刷新listview的使用

    最新内容建议直接访问原文:滚动到底部加载更多及下拉刷新listview的使用 本文主要介绍可同时实现下拉刷新及滑动到底部加载更多的ListView的使用. 该ListView优点包括:a. 可自定义下 ...

随机推荐

  1. C#丨爬虫基础

    在前几天看到一片公众号的文章是关于.NET玩爬虫. 所以今天小编索性来try一下,恰好小编最近在关注房价这一块的,索性就写了一个例子抓取房产信息的. 不善言辞的小编直接给出代码吧!相信读者也等不及了. ...

  2. AMD的cpu如何安装Mac OS

    AMD的cpu如何安装Mac OS       经过一个月的折腾,终于成功的安装了自己的Mac系统,并且能够成功的启动.在这里分享一下自己安装的经验.      为了安装方便,有不影响原来的系统的使用 ...

  3. OSS最新进度汇报(2.25)

    OSS系列最新进度情况如下:一. OSS.Social进度 1. 客服接口升级至新客服接口 2. BaseRecMsg中RecMsg字符串类型修改为xml类型 3. 添加Redis缓存注册实现,代码见 ...

  4. 游戏UI框架设计(三) : 窗体的层级管理

    游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...

  5. 为 instance 配置静态 IP - 每天5分钟玩转 OpenStack(157)

    这是 OpenStack 实施经验分享系列的第 7 篇. 传统运维中为服务器配置静态 IP 是再常见不过的了.但在 OpenStack 环境下只能指定 network,IP 都是 Neutron 从 ...

  6. angular : ngModel 内部流程

    angular 1.5 beta link NgModelController provides API for the ngModel directive. The controller conta ...

  7. 每天一个Linux命令(16)--which命令

    把昨天的,留给昨天:今日,你将重新开始. 好的,在第一个阶段我们学习了  文件目录的操作命令: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ls cd pwd mkdir ...

  8. CORS(跨域资源共享)

    Cors(Cross-origin Resource Sharing)基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方,从而决定响应成功与否. CORS与JSONP对比: 1.JSON ...

  9. JMX简单入门

    在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来来处理这些可配置项呢? 程序新手一般是写死在程序里,到要改变时就去改程序,然后再编译发布: 程序熟手则一般把这些信息写在一 ...

  10. Ajax页面的加载数据与删除

    1.数据库找一张表: 颜色表2.主页面主页面的代码用到tbody:TBODY作用是:可以控制表格分行下载,从而提高下载速度.(网页的打开是先表格的的内容全部下载完毕后,才显示出来,分行下载可以先显示部 ...