续上篇:

DBContext

在上篇 图一类库根目录创建的 DbContextBase

/// <summary>
/// 数据库上下文基类
/// </summary>
/// <typeparam name="TDbContext">实现了DbContext对象的上下文对象</typeparam>
public class DbContextBase: DbContext
{
#region ctor
public DbContextBase() : base(GetConnectionString()) { }
public DbContextBase(string nameOrConnectionString) : base(GetConnectionString()) { }
#endregion #region 获取数据库连接对象
private static string GetConnectionString()
{
string dbConnectionName = "Innovatordb";
ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings[dbConnectionName];
if (null == connectionStringSettings)
{
throw new InvalidOperationException("请配置数据库连接字符串,连接名称{0}".FormatWith(dbConnectionName));
}
return connectionStringSettings.ConnectionString;
}
#endregion protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//移除一对多级联删除
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
//注册实体配置信息
IEntityMapper[] entityMappers = InitialEntityMapper.Initial;
foreach (IEntityMapper mapper in entityMappers)
{
mapper.RegistTo(modelBuilder.Configurations);
}
} }

用于上下文对象的初始化,

此处出现了一个IEntityMapper的接口对象,,,,,这个稍后单独说下,还是出自O#,只不过现在的3.x版本的O#锋哥分的比较细,一时间不容易看清,所以稍后我从当初最基本的实现方式说。目的是将实体对象映射到上下文,见下方类定义(同样在上篇 图一的根目录)

映射步骤一:

EntityTypeConfiguration对该对象的继承,用于创建Mapping表关联以及表单字段属性时候使用。
/// <summary>
/// 数据实体映射配置基类
/// </summary>
/// <typeparam name="TEntity">动态实体类型</typeparam>
/// <typeparam name="TKey">动态主键类型</typeparam>
public abstract class EntityConfigurationBase<TEntity, TKey> : EntityTypeConfiguration<TEntity>, IEntityMapper
where TEntity : class
{
/// <summary>
/// 获取 相关上下文类型,如为null,将使用默认上下文,否则使用指定的上下文类型
/// </summary>
public virtual Type DbContextType
{
get { return null; }
} /// <summary>
/// 将当前实体映射对象注册到当前数据访问上下文实体映射配置注册器中
/// </summary>
/// <param name="configurations">实体映射配置注册器</param>
public void RegistTo(ConfigurationRegistrar configurations)
{
configurations.Add(this);
}
}

步骤二:(上篇 图一的根目录创建以下两个类)

/// <summary>
/// 实体映射接口
/// </summary>
public interface IEntityMapper
{
/// <summary>
/// 将当前实体映射对象注册到当前数据访问上下文实体映射配置注册器中
/// </summary>
/// <param name="configurations">实体映射配置注册器</param>
void RegistTo(ConfigurationRegistrar configurations); }
/// <summary>
/// 初始化实体对象
/// </summary>
public static class InitialEntityMapper
{
#region Initialize database entity mapper Collection object private static readonly ICollection<Assembly> _mapperAssemblies = new List<Assembly>();//用于存放mapper对象 /// <summary>
/// 加载实体映射对象程序集到集合-在Global中初始化
/// </summary>
/// <param name="assembly"></param>
//public static void AddMapperAssembly(Assembly assembly)
public static void InitialMapperAssembly(Assembly assembly)
{ if (assembly != null)
{
if (_mapperAssemblies.Any(a => a == assembly)) return;
_mapperAssemblies.Add(assembly);
}
} /// <summary>
/// 初始化实体属性-外部调用
/// </summary>
public static IEntityMapper[] Initial { get { return EntityMappers(); } } /// <summary>
/// 初始化Mapper对象 调用对象 OnModelCreating
/// </summary>
/// <returns></returns>
private static IEntityMapper[] EntityMappers()
{
try
{
Type baseType = typeof(IEntityMapper);
Type[] mapperTypes = _mapperAssemblies.SelectMany(assembly => assembly.GetTypes())
.Where(type => baseType.IsAssignableFrom(type) && type != baseType && !type.IsAbstract).ToArray();
IEntityMapper[] result = mapperTypes.Select(type => Activator.CreateInstance(type) as IEntityMapper)
.ToArray(); return result;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
} } #endregion }

至此,上下文对象初始化完毕,同时,实体的映射基本方法创建完成,可实现上下文实体对象的自动映射。

各段代码注释 写的也很清楚。

mvc5 + ef6 + autofac搭建项目(repository+uow)(二)的更多相关文章

  1. mvc5 + ef6 + autofac搭建项目(repository+uow)(一)

    直奔主题了,不那么啰嗦. 整体框架的参考来源是  O# 的框架,在此感谢锋哥一直以来的开源,让我们有的学 如下图: (图一) 一下分三个步骤说明,分别为 dbContext,repository,uo ...

  2. mvc5 + ef6 + autofac搭建项目(三)

    前面已经基本完成了框架的搭建,后面就是实现了,后面主要说下前端的东西bootstrap的使用和相关插件. 看图: 实现比较简单,在主页面只引入共用部分的 js等相关包,毕竟不是所有页面都需要列表以及其 ...

  3. mvc5 + ef6 + autofac搭建项目(四).1视屏上传生成截图

    即上一篇中上传涉及到的 一个视频生成截图的问题,这个很简单,这是上一篇中的代码片段 #region 视频上传,生成默认展示图片(自动剪切) try { string fileSavePath = Da ...

  4. mvc5 + ef6 + autofac搭建项目(四)

    在列表页面,点击新增,弹出窗口实现视屏上传,这里存在一个问题,就是大文件上传的问题,iis出于安全问题,有限制,当然这不是大问题,解决也很容易: 见截图: 请忽略视屏文件,看得懂的请装作不懂. 源码 ...

  5. 用MVC5+EF6+WebApi 做一个小功能(二) 项目需求整理

    在一个项目开始前,需求整理大概要占到整个项目周期15%甚至30%的比重,可以说需求理得越清楚,后续开发中返工几率越小.在一个项目中,开发新功能的花费的精力要远远小于修改功能的精力,这基本是一个共识.老 ...

  6. 基于springcloud搭建项目-公共篇(二)

    上一篇已经写过如何搭建注册中心eureka,这一篇主要是搭建一些公共的api接口服务,并把实体类单独拿出来放到一个服务上引用,比较简单的 1.首先.创建一个实体类服务,这样就不用在每个服务里创建实体了 ...

  7. vue搭建项目步骤(二)

    上篇是搭建Vue项目的基本,接下来是继续对做项目的记录.顺序并不一定. 五.对页面入口文件的修改: 众所周知,main.js 程序入口文件,加载各种公共组件,App.Vue为 页面入口文件.但是有时候 ...

  8. 从头开始一步一步实现EF6+Autofac+MVC5+Bootstarp极简前后台ajax表格展示及分页(二)前端修改、添加表格行点击弹出模态框

    在前一篇中,由于不懂jquery,前端做的太差了,今天做稍做修改,增加一个跳转到指定页面功能,表格行点击样式变化.并且在表格中加入bootstarp的按钮组,按钮点击后弹出模态框,须修改common, ...

  9. MVC5+EF6 简易版CMS(非接口) 第一章:新建项目

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

随机推荐

  1. JS判断浏览器是否支持某一个CSS3属性

    1.引子 css3的出现让浏览器的表现更加的丰富多彩,表现冲击最大的就是动画了,在日常书写动画的时候,很有必要去事先判断浏览器是否支持,尤其是在写CSS3动画库的时候.比如transition的ani ...

  2. Azure 媒体服务的 RTMP 支持和实时编码器

    Cenk Dingiloglu Azure 媒体服务高级项目经理 直播流媒体目前已在公共预览版中提供,其中一项受支持的输入协议便是 RTMP.RTMP 是用于输入和分发包括直播流媒体在内的丰富媒体的一 ...

  3. Cocos2d-x 坑之一:Xcode文件真实目录与工程视图目录

    Cocos2d-x一定要保证 Xcode文件真实目录与工程视图目录 的一致性,不然,会出现文件读取不了,或include不了的情况. 如果出现此类情况,优先查看真实目录的结构.

  4. 【转】为ListView每个Item上面的按钮添加事件

    原文网址:http://blog.csdn.net/qq435757399/article/details/8256453 1.先看下效果图:        在这里仅供测试,我把数据都写死了,根据需要 ...

  5. HDU 2546 饭卡

    http://acm.hdu.edu.cn/showproblem.php?pid=2546 呆呆. 饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memo ...

  6. ASPNET5中的那些K

    ASPNET5中的那些K ASP.NET 5最大的变化是什么?首当其冲的就是多了很多K,K表示的是ASP.NET vNext的项目代号“Project K”,但很容易让人想到一个汉字——“坑”,希望K ...

  7. Web---Cookie技术(显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放))

    本章博客讲解: 1.Cookie基本用法演示 2.演示Cookie的访问权限 3.演示Cookie的删除 4.利用Cookie显示用户上次登录的时间 5.利用Cookie技术显示用户最近浏览的若干个图 ...

  8. HDOJ/HDU 2087 剪花布条(indexOf()应用~~)

    Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入 ...

  9. JavaScript高级程序设计44.pdf

    unload事件 与load事件对应的是unload事件,这个事件在文档被完全卸载后触发,只要用户从一个页面切换到另一个页面,就会发生unload事件,最多的情况是清除引用,避免内存泄漏 与load事 ...

  10. SWFUpload无刷新文件批量上传

    一.首先将SWFUpload所有文件加入项目中,如图