mvc5 + ef6 + autofac搭建项目(repository+uow)(二)

续上篇:

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

    }

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

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

时间: 2024-10-12 17:01:14

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

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

前面已经基本完成了框架的搭建,后面就是实现了,后面主要说下前端的东西bootstrap的使用和相关插件. 看图: 实现比较简单,在主页面只引入共用部分的 js等相关包,毕竟不是所有页面都需要列表以及其他插件的包,所以我是在当前页面直接引入的,用不到的页面完全没必要加载,你说不是吗? 主要是bootstrap-table的使用:默认的导出功能(当然,这里我把导出功能按钮隐藏了) @{ Layout = "~/Views/Shared/_LayoutContext.cshtml"; } &

mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理

最近和朋友完成了一个大单子架构是mvc5+ef6+Bootstrap,用的是vs2015,数据库是sql server2014.朋友做的架构,项目完成后觉得很多值得我学习,在这里总结下一些心得. 创建项目一开始删掉App_Start目录下的IdentityConfig.cs和Startup.Auth.cs文件;清空Modle文件夹,Controller文件夹和相应的View; 删除目录下的ApplicationInsights.config文件和Startup.cs文件 修改web.config

【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

本来打算将搭建项目架构和集成SqlSugar放在一起讲的,但是感觉东西有点多,还是分成两章吧~ 这一章讲搭建项目的整体架构,这里先把搭建完成后的最终效果放出来,然后再逐个解释每层的作用. 可以看到这里一共有七层,源码在最下面,需要的可以参考源码进行对比(下面我按照自顶层向底层的顺序介绍,所以列出的顺序和图片有点区别) (一)RayPI主项目层 我在控制器文件夹下添加了两个文件夹,Admin和Client,分别用来存放后台和前端的接口. 这么做主要有两个理由,一个是我觉得这样可以把后台和前台的功能

MVC5+EF+AutoFac+AutoMapper轻型架构

今天和大家一起学习一下当前流行的MVC5+EF+AutoFac+AutoMapper轻型架构,先上一张框架图 一.项目基本框架搭建 写程序的顺序是Model-DAL-BLL-UI,Model层就是表实体,我们略过,下面上DAL层代码 using Model; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; usi

构建ASP.NET MVC5+EF6+EasyUI 1.5+Unity4.x注入的后台管理系统(1)-前言与目录(持续更新中...)

前言: 起初写这个框架的时候,可以说在当时来说并不是很流行的设计模式,那是在2012年,面向对象的编程大家都很熟悉, 但是“注入.控制反转(DI,IOC,依赖注入).AOP切面编程”新兴名词 很多人并不知道特别是从事.NET开发的人,至少在当时 是这么样的,但是在今天它们却是非常流行的技术指标,很多大牛也承认,这是主流的开发模式,你们可以从招聘网的技术岗位看出. 我从事过MVC2.0到5.0的相关开发工作,见证了MVC的成熟演变过程,就像本框架一样,设计模式未曾改变,但是代码一直在重 构.我也坚

ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 日程管理   http://www.cnblogs.com/ymnets/p/7094914.html 任务调度系统界面 http://www.cnblogs.com/ymnets/p/5065154.html 系统权限全套完整图  http://www.cnblogs.com/ymnets/p/5065201.html 系统

MVC5+EF6 入门完整教程九

前一阵子临时有事,这篇文章发布间隔比较长,我们先回顾下之前的内容,每篇文章用一句话总结重点. 文章一 MVC核心概念简介,一个基本MVC项目结构 文章二 通过开发一个最基本的登录界面,介绍了如何从Controller中获取表单数据 文章三 EF的整个开发过程 文章四 EF基本的CRUD和常用的HtmlHelper 文章五 使用布局页(模板页)改造UI 文章六 分部视图(Partial View) 文章七 排序过滤分页 文章八 不丢失数据进行数据库结构升级 以上如果有不清楚的可以再回去看一下. 文

(转)SVN服务器搭建和使用(二)

SVN服务器搭建和使用(二) 原文:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用. 首先打开VisualSVN Server Manager,如图: 可以在窗口的右边看到版本库的一些信息,比如状态,日志,用户认证,版本库等.要

MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理 MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案 先来了解下各项的引用关系 FytCms.DALMSSQL=>Domain.Entity.EntityFramework BusinessLogic.Server=>FytCms.D