今天记录一下自己的EntityFramework数据访问层。这里用通过泛型Repository的方式实现了数据的访问。先上一张结构图。

Configuration文件夹里面的类是全部实体映射类。这些类全部继承至EntityConfigurationBase类。

EntityConfigurationBase又继承至 EntityTypeConfiguration类,这是EntityFramework的实体映射基类

 1 using System.Data.Entity.ModelConfiguration;
 2 using System.Data.Entity.ModelConfiguration.Configuration;
 3
 4 using ZY.Core.Entities;
 5
 6 namespace ZY.Repositories.EntityFramework
 7 {
 8     /// <summary>
 9     /// 数据实体映射配置基类
10     /// </summary>
11     /// <typeparam name="TEntity"></typeparam>
12     /// <typeparam name="TKey"></typeparam>
13     public abstract class EntityConfigurationBase<TEntity, TKey> : EntityTypeConfiguration<TEntity>, IEntityMapper
14         where TEntity : class
15     {
16         //映射实体添加到数据上下文
17         public void RegistorTo(ConfigurationRegistrar configurations)
18         {
19             configurations.Add(this);
20         }
21     }
22 }

View Code

这里有个重要的方法就是RegistorTo(ConfigurationRegistrar configurations) 这个方法是将当前实体添加到数据上下文。这样不用在数据上下文写每一个实体的映射,将实体与上下文解耦出来了。在OnModelCreating(DbModelBuilder modelBuilder) 方法里面用到了反射,通过反射将所有实体映射关系添加到数据上下文中。这里可以优化一下就是,反射的时候可以用缓存。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data.Entity;
 7 using System.Data.Entity.ModelConfiguration.Conventions;
 8 using System.Reflection;
 9
10 namespace ZY.Repositories.EntityFramework
11 {
12     public class BaseDbContext : DbContext
13     {
14         public BaseDbContext()
15             : base("Default")
16         { }
17
18         public BaseDbContext(string connectionString)
19             :base(connectionString)
20         { }
21
22         protected override void OnModelCreating(DbModelBuilder modelBuilder)
23         {
24             //关闭级联删除
25             modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
26             //获取所有映射实体类
27             IEnumerable<IEntityMapper> entityMappers = GetEntityMappers().Select(type => Activator.CreateInstance(type) as IEntityMapper).ToList();
28
29             foreach (IEntityMapper mapper in entityMappers)
30             {
31                 mapper.RegistorTo(modelBuilder.Configurations);
32             }
33         }
34
35         /// <summary>
36         /// 通过反射 获取所有实体映射对象 优化的做法是保存在缓存中
37         /// </summary>
38         /// <returns></returns>
39         private Type[] GetEntityMappers()
40         {
41             Type[] mapperTypes = Assembly.GetExecutingAssembly().GetTypes()
42             .Where(type => !String.IsNullOrEmpty(type.Namespace))
43             .Where(type => type.BaseType != null && type.BaseType.IsGenericType &&
44             type.BaseType.GetInterface(typeof(IEntityMapper).Name) == typeof(IEntityMapper)).ToArray();
45             return mapperTypes;
46         }
47     }
48 }

View Code

数据迁移用了自动迁移,之前刚刚开始用EF的时候没有用自动迁移,遇到了很多坑,自从用了自动迁移,就没有管过迁移的事情了。

 1 using System.Data.Entity.Migrations;
 2
 3
 4 namespace ZY.Repositories.EntityFramework.Migrations
 5 {
 6     /// <summary>
 7     /// 自动迁移设置
 8     /// </summary>
 9     public class AutoMigrationsConfiguration : DbMigrationsConfiguration<BaseDbContext>
10     {
11         public AutoMigrationsConfiguration()
12         {
13             AutomaticMigrationsEnabled = true;//自动迁移
14             AutomaticMigrationDataLossAllowed = true;//允许数据丢失
15         }
16     }
17 }

View Code

Repository的代码在上一篇中已经贴出来了。实现了异步和同步的方法。

后续会将整个代码放到github上面

转载于:https://www.cnblogs.com/zyrmb/p/5289310.html

Repositories.EntityFramework 实现方式相关推荐

  1. 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

    <在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...

  2. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店...

    原文:[.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店 一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Bytear ...

  3. linux服务器上的回收站,为linux系统实现回收站

    在linux系统中,经常采用"rm *"或"rm -r *"操作删除一下文件,但是有时某些文件并不是我们想要删除的,但是已经被删除.很多时候都是悲剧的,数据是难 ...

  4. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

  5. 《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版

    前言 到目前为止写过刚好两百来篇博客,看过我博客的读者应该大概知道我每一篇博客都沿袭着一贯的套路,从前言到话题最终到总结,本文依然是一如既往的套路,但是不是介绍技术,也可说是介绍技术,不过是介绍书中的 ...

  6. ibatis 使用入门

    简介 iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵 ...

  7. 三种方式让你轻松监控 EntityFramework 中的 sql 流转

    大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们无法控制sql的生成策略,所以必须不要让自己 ...

  8. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因

    今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不多说,我们开始 环境和相关技术 本文采用的环境与技术 ...

  9. EntityFramework Core 2.0自定义标量函数两种方式

    前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...

  10. EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?

    写过上一篇关于EF Core中读写分离最佳实践方式后,虽然在一定程度上改善了问题,但是在评论中有的指出更换到从数据库. 那么接下来要进行插入此时又要切换到主数据库,同时有的指出是否可以进行底层无感知操 ...

最新文章

  1. 独家 | 准备数据时如何避免数据泄漏
  2. Lucene入门的基本知识(四)
  3. 十八、启动jmeter时提示findstr不是内部命令的解决方案
  4. Linux 文件基本属性
  5. python中的if not语句_python中使用if not x 语句用法
  6. 使用postman消费Marketing Cloud的contact读取API
  7. 吴继业:LinkedIn商业分析部如何运用大数据实现商业价值
  8. 深入了解Oracle IDM审核
  9. python 标准库 —— io(StringIO)
  10. GridViewObjectDataSource新特性小记 懒人篇(一) 分页上路
  11. 历年软考网络工程师考试真题及答案
  12. 等价类划分法设计测试用例
  13. 栈——后进先出(LIFO:last in first out)
  14. uniapp长按识别二维码、小程序码
  15. 为什么 MySQL 不建议执行超过 3 表以上的多表关联查询?
  16. 视频格式转换器哪个好?用什么软件转换格式
  17. 如何通过API方式集成金蝶ERP
  18. 区块链技术 ——区块链概述
  19. Java 位运算详解
  20. 在线获取访客QQ号码的原理及实现方法

热门文章

  1. 关于DataSet与Strongly typed DataSet几点思考(原创)
  2. 哈希(不可逆)加密通用类库函数
  3. python源码中的学习笔记_第10章_面向对象的特征、特殊方法与属性、以及深浅拷贝
  4. 【从 0 开始机器学习】手把手用 Python 实现梯度下降法!
  5. Exadata中最有用的功能-存储索引
  6. CDN的基本概念和产生背景
  7. 范围分区在数据过期化处理中的应用
  8. 开源软件技巧与精髓分享
  9. 走近汇编理解与内核编程
  10. 贝叶斯分类与贝叶斯网络