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

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

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

 using System.Data.Entity.ModelConfiguration;
using System.Data.Entity.ModelConfiguration.Configuration; using ZY.Core.Entities; namespace ZY.Repositories.EntityFramework
{
/// <summary>
/// 数据实体映射配置基类
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TKey"></typeparam>
public abstract class EntityConfigurationBase<TEntity, TKey> : EntityTypeConfiguration<TEntity>, IEntityMapper
where TEntity : class
{
//映射实体添加到数据上下文
public void RegistorTo(ConfigurationRegistrar configurations)
{
configurations.Add(this);
}
}
}

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Reflection; namespace ZY.Repositories.EntityFramework
{
public class BaseDbContext : DbContext
{
public BaseDbContext()
: base("Default")
{ } public BaseDbContext(string connectionString)
:base(connectionString)
{ } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//关闭级联删除
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
//获取所有映射实体类
IEnumerable<IEntityMapper> entityMappers = GetEntityMappers().Select(type => Activator.CreateInstance(type) as IEntityMapper).ToList(); foreach (IEntityMapper mapper in entityMappers)
{
mapper.RegistorTo(modelBuilder.Configurations);
}
} /// <summary>
/// 通过反射 获取所有实体映射对象 优化的做法是保存在缓存中
/// </summary>
/// <returns></returns>
private Type[] GetEntityMappers()
{
Type[] mapperTypes = Assembly.GetExecutingAssembly().GetTypes()
.Where(type => !String.IsNullOrEmpty(type.Namespace))
.Where(type => type.BaseType != null && type.BaseType.IsGenericType &&
type.BaseType.GetInterface(typeof(IEntityMapper).Name) == typeof(IEntityMapper)).ToArray();
return mapperTypes;
}
}
}

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

 using System.Data.Entity.Migrations;

 namespace ZY.Repositories.EntityFramework.Migrations
{
/// <summary>
/// 自动迁移设置
/// </summary>
public class AutoMigrationsConfiguration : DbMigrationsConfiguration<BaseDbContext>
{
public AutoMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;//自动迁移
AutomaticMigrationDataLossAllowed = true;//允许数据丢失
}
}
}

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

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

Repositories.EntityFramework 实现方式的更多相关文章

  1. C#+EntityFramework编程方式详细之Code First 数据迁移

    在前几篇的C#+EntityFramework编程方式中介绍了C#+EntityFramework编程方式Code First ,Model First以及Dtatabase First 等编程方式, ...

  2. C#+EntityFramework编程方式详细之Model First

    Model First Model First模式即“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在VS中 ...

  3. C#+EntityFramework编程方式详细之Code First

    Code First Code First模式即“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时只需要编写对应的数据类,然后自动生成数据库. Code F ...

  4. C#+EntityFramework编程方式详细之Database First

    Database First “Database First”模式即“数据库优先”,其实Database First 与Model First 很类似,只不过一个是有数据可一个是创建数据库,具体的操作 ...

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

    一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...

  6. 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践

    写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...

  7. 一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?

    写在前面 阅读目录: 问题根源是什么? <领域驱动设计-软件核心复杂性应对之道>分层概念 Repository(仓储)职责所在? Domain Model(领域模型)重新设计 Domain ...

  8. Apworks框架实战(六):使用基于Entity Framework的仓储基础结构

    在前面的章节中,我们已经设计了一个简单的领域模型,接下来我们希望能够实现领域模型的持久化及查询.在Apworks中,实现了面向Entity Framework.NHibernate以及MongoDB的 ...

  9. DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射

    写在前面 首先,这篇博文是用博客园新发布的 MarkDown编辑器 编写的,这也是我第一次使用,语法也不是很熟悉,但我觉得应该会很爽,博文后面再记录下用过的感受,这边就不多说. 阅读目录: 上一篇回顾 ...

随机推荐

  1. js模块,类,继承,命名空间,私有属性等相关概念梳理

    js确切的说是一种基于对象的语言,和纯面向对象的语言(比如as)稍微有点区别,js中没有类的概念.虽然有继承但是基于原型的继承.随着前段越来越受重视,jser们利用js的一些特性他们制造出了和纯面向对 ...

  2. [liu yanling]测试用例作用

    ⒈指导测试的实施 测试用例主要适用于集成测试.系统测试和回归测试.在实施测试时测试用例作为测试的标准,测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试.并对测试情况记录在测试用例管理软件 ...

  3. OpenGL ES 的三种变量类型(uniform,attribute和varying)

    1.uniform变量 uniform变量是外部application程序传递给(vertex和fragment)shader的变量.因此它是application通过函数glUniform**()函 ...

  4. JDK源码重新编译——支持eclipse调试JDK源码--转载

    最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar. 下面这六步是编译jdk的具体步骤: Step 1:   ...

  5. winpcap使用之捕获数据包

    第一种方法,调用回调函数 #include "pcap.h" /* packet handler 函数原型 */ void packet_handler(u_char *param ...

  6. YUV转灰度

    转载自:http://blog.csdn.net/sxjk1987/article/details/7470545 标准的V4L2 API http://v4l.videotechnology.com ...

  7. VellCar(法拉利车模)

    玩了近9小时,手都疼了,1322个零件真不是个小数字啊...不说了,上图纪念下:

  8. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

    概述: UI即User Interface(用户界面)的简称.UI设计是指对软件的燃机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏整 ...

  9. 源码生成deb包

    方法一 源码包要求是使用 automake 进行编译管理的. 安装路径不能指定为 /usr/local 下的目录,否则生成 deb 包期间报错. 制作的工具是 dh-make ,如果没有安装,要先安装 ...

  10. 局域网接入Internet

    说在前面的话 局域网接入Internet的方式多样: 有1传统的Modem(调制解调器)拨号接入,费用低廉的2 ISDN和 3 ADSL接入,费用较高的4 DDN专线接入,5 Cable Modem高 ...