接下来放一个用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. 在vi或者vim中显示行号

    1. 为了显示行号,在vi/vim编辑器中执行一下命令中的一条 :set number 或者 :set nu 2. 为了关闭行号,在vi/vim编辑器中执行下面命令 :set nu! 如果你想要每次启 ...

  2. 第三章:初识Jquery

    一.Jquery的优势 体积小,压缩后只有100KB左右 强大的选择器 出色的DOM封装 可靠的事件处理机制 出色的浏览器兼容性 使用隐式迭代简化编程 丰富的插件支持 二.Jquery语法 三.DOM ...

  3. JLOI2015 解题报告

    JLOI2015 真的不愧是NOI出题组出的,题目难度够吊.不过每一道都是结论题和乱搞题真的很不好玩... T1:[JLOI2015]有意义的字符串 首先贴下popoqqq的blog吧 感性的认识就是 ...

  4. SimpleDateFormat的线程安全问题与解决方案

    SimpleDateFormat 是 Java 中一个常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题. 因为 DateFormat 和 Simple ...

  5. 【2017-02-24】循环嵌套、跳转语句、异常语句、迭代穷举、while

    一.循环嵌套 1.格式 for() { for() { } } 2.执行顺序 先执行外边循环进到循环体发现里面的循环,开始执行里面的循环.等到里面的循环执行完毕,再执行外边的循环. 在外面循环第一次, ...

  6. 数字化工厂ERP解决方案

    数字化工厂 数字化工厂建设,在现有基础上提升,实现管理层对订单进度.生产绩效.产能分析.质量管理.产品追溯和存货管理等提供业务分析报告:在控制层有可视化看板.移动客户端实现对生产状态的实时掌控,快速处 ...

  7. [HDU1232] 畅通工程 (并查集 or 连通分量)

    Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的 ...

  8. Java基础(下)(JVM、API)

    Java基础(下) 第三部分:Java源程序的编辑 我们知道,计算机是不能直接理解源代码中的高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译 ...

  9. ios录音Demo

    <AudioToolbox/AudioToolbox.h> :这个库是C的接口,偏向于底层,主要用于在线流媒体的播放 <AVFoundation/AVFoundation.h> ...

  10. C 风格字符串相加

    <<C++ Primer>> 第四版Exercise Section 4.3.1 的4.3.0 有如下题目:编写程序连接两个C风格字符串字面值,把结果存储在C风格字符串中.代码 ...