随笔 - 95  文章 - 1  评论 - 411  阅读 - 10万
 
摘要: ASTreeView是一个免费的树控件,支持拖拽,右键菜单(编辑,删除,增加),动态加载(Dynamic Loading),客户端、服务端事件支持,xml导入导出。稳定,快速。欢迎大家试用。 ASTreeView更新到1.5.8了,以下是更新记录: 新增API: SelectNode – 根据节点值选中节点。CheckNodes – 根据节点值勾选节点。UnCheckNodes - 取消勾选节点,... 阅读全文
posted @ 2010-06-03 13:57 JIN Weijie 阅读(5108) 评论(63) 推荐(37) 编辑
 
摘要: 买了一个空间,用subText搭了blog,现在正陆陆续续地把这里的随笔转移过去,并加上一些注释,尽量完善一点。如果您有兴趣,不妨经常来 http://www.jinweijie.com 坐坐,谢谢! :) 阅读全文
posted @ 2009-01-14 10:09 JIN Weijie 阅读(458) 评论(5) 推荐(1) 编辑
  2017年7月24日

简介

之前写个一个基于Dapper的分页实现,现在再来写一个基于Entity Framework的分页实现,以及增删改的通用实现。

代码

还是先上代码:https://github.com/jinweijie/EF.GenericRepository

如何运行示例

还是像先前一样:

1. 先Clone下代码,在Database里面解压缩Database.7z

2. Attach到Sql Server LocalDB上。如果你用的不是Sql Server的LocalDB,你需要更改App.Config里的连接字符串。

3. Ctrl + F5,运行示例程序。

Repository 基类 - 查询

Common\AbstractRepository.cs 是Repository的基类,实现了增删改查的一些方法,例如:

public virtual Tuple<IEnumerable<T>, int> Find(Expression<Func<T, bool>> criteria
            , int pageIndex
            , int pageSize
            , string[] asc
            , string[] desc
            , params Expression<Func<T, object>>[] includeProperties)

这个方法是AbstractRepository查询方法中的一个,用于自定义分页查询,其中criteria 为一个表达式,作为查询的条件,参数pageIndex, pageSize, asc, desc为分页相关参数;

关于多表(关联表):

includeProperties为在多表时候,Join相关联的表。因为EF默认是Lazy Loading,相关联的表默认不是立即加载的,所以有时候如果写代码不小心,在for循环里就有可能会循环查询n个字表。用来includeProperties参数,就可以在查询时候join关联表。

Repository 基类 - 增删改

AbstractRepository已经用泛型实现了增删改方法:

  • public virtual T Create(T entity)
  • public virtual T Update(T entity)
  • public virtual T CreateOrUpdate(T entity)
  • public virtual void Delete(TId id)

 另外,关于transaction的实现,我使用了Unit of Work模式,多个Repository共享一个DBContext,关于UOW,请在Common\UnitOfWork.cs里找到。

 调用UOW的时候,基本类似于这样:

var uow = new EFUnitOfWork();
var repo = uow.GetLogRepository();

repo.Create(new Log
{
    LevelId = 1,
    Thread = "",
    Location = "Manual Creation",
    Message = "This is manually created log.",
    CreateTime = DateTimeOffset.Now,
    Date = DateTime.Now
});

uow.Commit();

从UnitOfWork里得到一个或多个Repository,共享DBContext,做增删改操作,最后uow统一SaveChanges。

 Repository的派生类

由于已经有了AbstractRepository,实现了增删改查的很多方法,所以派生类,例如示例项目里的LogRepository基本就可以变得很简单,主要实现一些特定的业务逻辑,在示例项目里,因为没有特殊的业务逻辑,所以会很简单:

    public class LogRepository : AbstractRepository<Log, int>
    {
        public LogRepository(EFContext context)
            : base(context)
        {
        }
    }

关于Entity的生成

本人比较喜欢Database First 实现,先设计数据库,然后用edmx reverse engineering,生成POCO。可以参考Entity目录下的相关文件。

当然,如果你喜欢Code First,同样没有问题,仍然适用本文的实现。

使用Logging日志追踪EF SQL

在使用Entity Framework的时候,最好关心一下EF所生成的SQL,这样可以在开发阶段发现一些潜在的性能问题,避免在生产环境焦头烂额:)

在Common\EFContext.cs 里,有一个配置项EnableTraceSql,如果为true,那么所以EF生成的SQL将会被nlog记录下来。我将nlog的日志配置到了数据库。也就是说,在你运行示例项目时,每次查询,都会增加新的日志记录,内容为查询时生成的SQL:

 Specification Pattern

在查询方法里,有个重载是接受一个ISpecification示例,这样的实现可以有效的控制业务逻辑,对于写给被其他人调用的接口来说,可以明确的确定查询参数,例如:

    public class LogSearchSpecification : ISpecification<Log>
    {
        public string LevelName { get; set; }
        public string Message { get; set; }
        public Expression<Func<Log, bool>> ToExpression()
        {
            return log => (log.Level.Name == LevelName || LevelName == "") &&
                          (log.Message.Contains(Message) || Message == "");
        }

        public bool IsSatisfiedBy(Log entity)
        {
            return (entity.Level.Name == LevelName || LevelName == "") &&
                   (entity.Message.Contains(Message) || Message == "");
        }
    }

那么,调用这个查询方法的代码就可以明确知道,我的查询条件为LevelName和Message,至于LevelName是等于以及Message为Like则是在LogSearchSpeficiation里实现,做到很好的封装。

最后

这套实现是几年来平时慢慢积累的,是经过实践的,所以应该可以作为一定的参考,当然,在具体的项目里,可以用一些DI去拿到Repository等等,不在本文讨论范围,大家可以自由发挥,希望对大家可以有所帮助,谢谢。

posted @ 2017-07-24 07:40 JIN Weijie 阅读(2190) 评论(7) 推荐(3) 编辑
  2017年7月10日
摘要: 一个基于Dapper的自定义分页实现,支持筛选,排序,结果集总数,非存储过程实现。 阅读全文
posted @ 2017-07-10 15:02 JIN Weijie 阅读(10289) 评论(4) 推荐(5) 编辑
  2013年6月18日
摘要: 360要推便携路由器,个人觉得其主要目的是盯住了用户无线设备上的信息。因为如果用户移动设备都通过它这个路由器走的话,未加密的数据全部在他掌控之中。 其实Windows 7以上的系统是非常容易建立无线热点的,为了更容易地实现将PC作为无线热点的功能,写了个小工具,希望大家少去用360这种危险的东西。 实现原理其实很简单,调用命令行,运行一下几条命令: 启动虚拟无线AP: netsh wlan... 阅读全文
posted @ 2013-06-18 22:36 JIN Weijie 阅读(5054) 评论(47) 推荐(17) 编辑
  2011年3月15日
摘要: 同时在用twitter和新浪微博,在twitter上主要看贴为主,在新浪微博上发帖比较多。于是就想到是否搞一下将新浪微博同步到twitter上。搜索了下,发现月光博客上提供了解决方案,不过稍有遗憾的是没有图片的同步。于是就自己用asp.net实现了下,用下来感觉还行,所以分享一下,同时提供源代码,如果有定制开发的朋友可以修改源码,但如果再发布时候,请注明出处,先谢谢了! 下载 前往下载新浪微博RSS生成器Ver 1.0 发布包及源码包 示例效果 部署在家里机器上,可能不稳定。 http://jinweijie.zapto.org:8080/SinaFeed/Default.aspx?SinaU 阅读全文
posted @ 2011-03-15 10:12 JIN Weijie 阅读(2250) 评论(2) 推荐(2) 编辑
  2011年1月1日
摘要: 2011了,大家新年好! 外面寒冷,躲在家里写写博客还是挺好的。 今天为我的博客修改了下jQuery的Thickbox,增加了预加载图片功能和点击图片前后浏览的功能。 首先看下效果: http://www.jinweijie.com/photo/?album=1&gallery=3 效果图(看右侧的箭头) 先说说预加载功能 点击图片,当图片加载完毕以后,会自动加载后2张图片,这样,浏览起来会变得很顺畅。 主要代码: 替换thickbox.js中的:为接着是浏览按钮功能最后修改thickbox.js,由于代码太长了,就不贴出来了,大家有兴趣可以看看,或者直接用就行了。下载请到 http:// 阅读全文
posted @ 2011-01-01 15:39 JIN Weijie 阅读(2179) 评论(6) 推荐(6) 编辑
  2010年2月7日
摘要: ASTreeView 1.5.3发布啦,相比1.4.0,新版本改进了很多,还增加了几个很多朋友关心的功能。 下面我介绍下1.5.3中有哪些新东西: 1. 增加了新的节点类型:TextNode 使用TextNode, 开发者可以很灵活地使用html作为树节点的NodeText,这就意味着树节点可以是2个hyperlink,可以有多种颜色,甚至可以是javascript。 来个截图: 或者访问Demo看效果 2. 增加EnableDragDropOnIcon属性 当使用TextNode作为树节点时,节点的拖拽就成了问题,因为ASTreeView不知道树节点里的html会是什么。所以我增加了Enab 阅读全文
posted @ 2010-02-07 23:52 JIN Weijie 阅读(3943) 评论(35) 推荐(24) 编辑
  2010年1月4日
摘要: ASTreeView 1.4.0 免费树控件 更新:1. 拖拽支持横向锁定 2.限定拖动层级 3. 增加OnNodeDragAndDropStartScript事件 4.增加了动态载入PostBack的解决办法 阅读全文
posted @ 2010-01-04 21:56 JIN Weijie 阅读(2023) 评论(15) 推荐(2) 编辑
  2009年11月27日
摘要: 从1.1.1到1.3.0,有以下的改进: 1.右键菜单扩展 2.主题支持 3.左到右(ltf)显示支持 4.点击父节点展开/收缩节点 5.节点支持html 6.支持转义字符 7.支持多行编辑 8.支持拖拽事件 9.禁止子节点属性 阅读全文
posted @ 2009-11-27 10:18 JIN Weijie 阅读(2646) 评论(47) 推荐(6) 编辑
  2009年10月16日
摘要: 继ASTreeView 1.0发布以后,得到了很多朋友的关注和使用,在这里先感谢这些朋友们! 通过这些反馈,发现了ASTreeView的一些bug和新功能的需求。 新版本1.1.1可以从http://astreeview.googlecode.com/files/astreeview1.1.1.zip 下载,包含示例代码。 新版本的ASTreView修复的bug: 修复了和jQuery冲突问题(主要是由于$方法所引起的),感谢xiaot的意见。 下拉框树的验证控件无法禁用问题,感谢zzdfc朋友的意见。 在网络慢的情况下初始化下拉框树可能出现js报错。 拖拽最后节点时,树线无法正确 阅读全文
posted @ 2009-10-16 14:17 JIN Weijie 阅读(2838) 评论(23) 推荐(6) 编辑
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示