系统启动时执行任务:IStartupTask,启动时执行的任务主要是数据库的初始化和加载。

IStartupTask调用IEfDataProvider进行数据库的初始化。

IEfDataProvider,SqlCeDataProvider:获取数据连接工厂,不同类型数据库,连接工厂不同。

接口IStartupTask的实体类EfStartUpTask的实现如下:

  1. public class EfStartUpTask : IStartupTask
  2. {
  3. public void Execute()
  4. {
  5. var settings = EngineContext.Current.Resolve<DataSettings>();
  6. if (settings != null && settings.IsValid())
  7. {
  8. var provider = EngineContext.Current.Resolve<IEfDataProvider>();
  9. if (provider == null)
  10. throw new NopException("No EfDataProvider found");
  11. provider.SetDatabaseInitializer();
  12. }
  13. }
  14. public int Order
  15. {
  16. //ensure that this task is run first
  17. get { return -1000; }
  18. }
  19. }

SqlCeInitializer,CreateCeDatabaseIfNotExists初始化数据库。

IDbContext,NopObjectContext系统数据库操作上下文。加载所有数据库映射类:EntityTypeConfiguration<TEntityType>。代码如下:

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  2. {
  3. //dynamically load all configuration
  4. //System.Type configType = typeof(LanguageMap);   //any of your configuration classes here
  5. //var typesToRegister = Assembly.GetAssembly(configType).GetTypes()
  6. var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
  7. .Where(type => !String.IsNullOrEmpty(type.Namespace))
  8. .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
  9. foreach (var type in typesToRegister)
  10. {
  11. dynamic configurationInstance = Activator.CreateInstance(type);
  12. modelBuilder.Configurations.Add(configurationInstance);
  13. }
  14. //...or do it manually below. For example,
  15. //modelBuilder.Configurations.Add(new LanguageMap());
  16. base.OnModelCreating(modelBuilder);
  17. }

此方法是继承自DbContext。并在系统启动时调用,建立数据表与实体的对应关系。

在类型依赖注册类Nop.Web.Framework.DependencyRegistrar中实现数据库工厂的创建、数据库的加载。如下代码:

  1. //data layer
  2. var dataSettingsManager = new DataSettingsManager();
  3. var dataProviderSettings = dataSettingsManager.LoadSettings();
  4. builder.Register(c => dataSettingsManager.LoadSettings()).As<DataSettings>();
  5. builder.Register(x => new EfDataProviderManager(x.Resolve<DataSettings>())).As<BaseDataProviderManager>().InstancePerDependency();
  6. builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IDataProvider>().InstancePerDependency();
  7. builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IEfDataProvider>().InstancePerDependency();
  8. if (dataProviderSettings != null && dataProviderSettings.IsValid())
  9. {
  10. var efDataProviderManager = new EfDataProviderManager(dataSettingsManager.LoadSettings());
  11. var dataProvider = (IEfDataProvider)efDataProviderManager.LoadDataProvider();
  12. dataProvider.InitConnectionFactory();
  13. builder.Register<IDbContext>(c => new NopObjectContext(dataProviderSettings.DataConnectionString)).InstancePerHttpRequest();
  14. }
  15. else
  16. {
  17. builder.Register<IDbContext>(c => new NopObjectContext(dataSettingsManager.LoadSettings().DataConnectionString)).InstancePerHttpRequest();
  18. }
  19. builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();

接口IEfDataProvider 的实体类SqlServerDataProvider的数据库初始化方法如下:

  1. /// <summary>
  2. /// Set database initializer
  3. /// </summary>
  4. public override void SetDatabaseInitializer()
  5. {
  6. //pass some table names to ensure that we have nopCommerce 2.X installed
  7. var tablesToValidate = new[] {"Customer", "Discount", "Order", "Product", "ShoppingCartItem"};
  8. //custom commands (stored proedures, indexes)
  9. var customCommands = new List<string>();
  10. //use webHelper.MapPath instead of HostingEnvironment.MapPath which is not available in unit tests
  11. customCommands.AddRange(ParseCommands(HostingEnvironment.MapPath("~/App_Data/SqlServer.Indexes.sql"), false));
  12. //use webHelper.MapPath instead of HostingEnvironment.MapPath which is not available in unit tests
  13. customCommands.AddRange(ParseCommands(HostingEnvironment.MapPath("~/App_Data/SqlServer.StoredProcedures.sql"), false));
  14. var initializer = new CreateTablesIfNotExist<NopObjectContext>(tablesToValidate, customCommands.ToArray());
  15. Database.SetInitializer(initializer);
  16. }

另外,EntityFramework本事是ORM框架,通过数据库访问上下文建立与数据库的连接及实体与数据表的对应广西。并通过创建IRepository<T>的泛型实体类来实现对每一种数据的处理,也就是所谓的Dao层。业务逻辑层通过每种实体的数据访问仓库Repository<T>来进行数据库操作。如下图:

NopCommerce架构分析之三---数据库初试化及数据操作的更多相关文章

  1. nopCommerce 数据库初试化及数据操作

    系统启动时执行任务:IStartupTask,启动时执行的任务主要是数据库的初始化和加载. IStartupTask调用IEfDataProvider进行数据库的初始化. IEfDataProvide ...

  2. NopCommerce架构分析(转载)

    原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...

  3. 悠星网络基于阿里云分析型数据库PostgreSQL版的数据实践

    说到“大数据”,当下这个词很火,各行各业涉及到数据的,目前都在提大数据,提数据仓库,数据挖掘或者机器学习,但同时另外一个热门的名词也很火,那就是“云”.越来越多的企业都在搭建属于自己的云平台,也有一些 ...

  4. NopCommerce架构分析之一----依赖类生成容器

    NopCommerce为了实现松耦合的框架设计目的,使用了IOC框架:Autofac.据有人测试,Autofac是性能好的IOC工具. 1.在IOC中,组件首先需要在IOC中注册,有通过配置文件注册的 ...

  5. nopCommerce架构分析系列(二)数据Cache

    原文(http://www.cnblogs.com/gusixing/archive/2012/04/12/2443799.html)非常感谢作者顾思行的分享! 序言 在很多访问量较大的系统中,尤其在 ...

  6. NopCommerce架构分析之六------自定义RazorViewEngine

    系统中对Razor的支持包括两部分,其中之一就是自定义RazorViewEngine 一.自定义RazorViewEngine 在Global.asax.cs的Application_Start方法中 ...

  7. NopCommerce架构分析之四----插件机制

    NopCommerce支持灵活的插件机制,所谓Web系统插件,其实也就是可以像原系统的一部分一样使用. Web系统的使用方式就是客户端发送一个请求,服务端进行解析.在asp.net MVC中对客户请求 ...

  8. NopCommerce架构分析之八------多语言

    系统支持的语言是有类:Language表示: 多语言资源对应的类为:LocalizedProperty: 当先选择某种语言存储在类中:GenericAttribute: 多语言可以导出为XML文件,当 ...

  9. NopCommerce架构分析之五------Model绑定Action参数

    asp.net MVC中Action参数不只是一些基本类型,也支持实体参数.那么从客户端传来的数据如何映射或转换成实体对象呢?就是通过实体绑定类ModelBinder.此系列类在请求转化为后台Cont ...

随机推荐

  1. 五、mysql存储引擎

    show variable like 'table_type'; 显示系统默认存储引擎 show engine\G 显示系统支持存储殷勤 =============================== ...

  2. PHP - PDO 之 mysql 事务功能

    <?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...

  3. java运算符的优先级和详解

    优先级 符号 名称 结合性(与操作数) 目数 说明 1 . 点 从左到右 双目 ( ) 圆括号 从左到右   [ ] 方括号 从左到右   2 + 正号 从右到左 单目 - 负号 从右到左 单目 ++ ...

  4. 使用Schtasks命令的注意事项

    在使用Schtasks命令时遇到了两个棘手的问题,耗费了一点时间,出现这个问题的时候查找网络资源也找不到真正的解决方案,最后还是自己悟出来了原因,所以在此把这些问题记录下来.如下: 服务器环境:win ...

  5. WDS无线桥接

    因为放假回家,长时间不在家,家里也没什么人,所以也就没有网可以用.为了两个月办宽带又不值得,太过浪费了.于是就只能蹭网用了.当然,要和邻居打个招呼或者你能搞定密码的情况下不打招呼(嘿嘿...).但是有 ...

  6. Codeforces Round #260 (Div. 1) C. Civilization 树的中心+并查集

    题目链接: 题目 C. Civilization time limit per test1 second memory limit per test256 megabytes inputstandar ...

  7. VB将PDF流写入ACCESS数据库,通过AcroPDF控件读出PDF流之实现

    问题描述: 1.把pdf文件写入access2.读出时用AcroPDF控件 问题解答: 使用流对象保存和显示图片与文件打开vb6,新建工程. 添加两个按钮,一个image控件注意:Access中的ph ...

  8. Android 国际化文字

    本例演示中英文切换 在resource文件夹添加values-zh,这个文件夹对应中文环境的values文件夹,然后添加strings.xml: <?xml version="1.0& ...

  9. Servlet课程0425(四) Servlet实现简单用户登录验证

    Login.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; public class ...

  10. memcached部署memcached环境及PHP扩展

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lxsym.blog.51cto.com/1364623/876209 Memca ...