续上篇:

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. BZOJ_1565_[NOI2009]_植物大战僵尸_(Tarjan+最大流+最大权闭合图)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1565 n*m的矩阵,可以种植植物,僵尸从图的右边进入吃植物.前面的植物可以保护后面的植物,还有 ...

  2. 【转】Android4.4 之Bluetooth整理

    原文网址:http://www.cnblogs.com/shed/p/3737016.html Android 4.4上蓝牙协议栈采用的是BRCM和Google共同开发的bluedroid,代替了之前 ...

  3. How to Create a SharePoint 2010 Project Without SharePoint Server

    转:http://community.bamboosolutions.com/blogs/sharepoint-2010/archive/2012/06/21/create-a-sharepoint- ...

  4. Ajax在PC端可以使用但在手机端不能使用

    ajax代码如下,仔细看看也没有什么错,电脑端可以调用并正确的返回结果,手机端却不可以 function GetSumData(time) { var device = "Phone&quo ...

  5. Devexpress之barManager

    隐藏菜单栏左边的竖线和右边的箭头? 1.隐藏菜单栏上右边的箭头属性设置:OptionsBar=>>AllowQuickCustomization=False 2.隐藏菜单栏左边的竖线属性设 ...

  6. bzoj 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集)

    Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的 时候有一个独一无二的位置坐标Xi,Yi( ...

  7. [Android Framework]linux 文件系统

    目录名   bin 用户二进制工具 boot Linux内核镜像文件, 由bootloader程序读取并装载 dev 各种系统硬件设备 etc 系统配置文件及其他配置文件 home 用户工作目录 li ...

  8. PAT 1076. Forwards on Weibo (30)

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  9. 【转】G40-70、G50-70联想小新笔记本SR1000随机Linux改Windows 7系统操作指导

    http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20140505150749705.html 适用范围:G40-70,G50-70联想小新笔 ...

  10. Unity3D中Prefab

    Prefab概念: Prefab是一种资源类型--存储在项目视图中的一种可反复使用的游戏对象.因而当游戏中须要非常多反复使用的对象.资源等时,Prefab就有了用武之地.它拥有下面特点: 能够放到多个 ...