NopCommerce架构分析之(三)EntityFramework数据库初试化及数据操作_自学过程

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

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

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

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

public class EfStartUpTask : IStartupTask
{
 public void Execute()
 {
  var settings = EngineContext.Current.Resolve<DataSettings>();
  if (settings != null && settings.IsValid())
  {
   var provider = EngineContext.Current.Resolve<IEfDataProvider>();
   if (provider == null)
    throw new NopException("No EfDataProvider found");
   provider.SetDatabaseInitializer();
  }
 } 

 public int Order
 {
  //ensure that this task is run first
  get { return -1000; }
 }
}

SqlCeInitializer,CreateCeDatabaseIfNotExists初始化数据库。

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
 //dynamically load all configuration
 //System.Type configType = typeof(LanguageMap); //any of your configuration classes here
 //var typesToRegister = Assembly.GetAssembly(configType).GetTypes() 

 var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
 .Where(type => !String.IsNullOrEmpty(type.Namespace))
 .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
 foreach (var type in typesToRegister)
 {
 dynamic configurationInstance = Activator.CreateInstance(type);
 modelBuilder.Configurations.Add(configurationInstance);
 }
 //...or do it manually below. For example,
 //modelBuilder.Configurations.Add(new LanguageMap()); 

 base.OnModelCreating(modelBuilder);
} 

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

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

//data layer
var dataSettingsManager = new DataSettingsManager();
var dataProviderSettings = dataSettingsManager.LoadSettings();
builder.Register(c => dataSettingsManager.LoadSettings()).As<DataSettings>();
builder.Register(x => new EfDataProviderManager(x.Resolve<DataSettings>())).As<BaseDataProviderManager>().InstancePerDependency(); 

builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IDataProvider>().InstancePerDependency();
builder.Register(x => (IEfDataProvider)x.Resolve<BaseDataProviderManager>().LoadDataProvider()).As<IEfDataProvider>().InstancePerDependency(); 

if (dataProviderSettings != null && dataProviderSettings.IsValid())
{
 var efDataProviderManager = new EfDataProviderManager(dataSettingsManager.LoadSettings());
 var dataProvider = (IEfDataProvider)efDataProviderManager.LoadDataProvider();
 dataProvider.InitConnectionFactory(); 

 builder.Register<IDbContext>(c => new NopObjectContext(dataProviderSettings.DataConnectionString)).InstancePerHttpRequest();
}
else
{
 builder.Register<IDbContext>(c => new NopObjectContext(dataSettingsManager.LoadSettings().DataConnectionString)).InstancePerHttpRequest();
} 

builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();

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

/// <summary>
/// Set database initializer
/// </summary>
public override void SetDatabaseInitializer()
{
 //pass some table names to ensure that we have nopCommerce 2.X installed
 var tablesToValidate = new[] {"Customer", "Discount", "Order", "Product", "ShoppingCartItem"}; 

 //custom commands (stored proedures, indexes) 

 var customCommands = new List<string>();
 //use webHelper.MapPath instead of HostingEnvironment.MapPath which is not available in unit tests
 customCommands.AddRange(ParseCommands(HostingEnvironment.MapPath("~/App_Data/SqlServer.Indexes.sql"), false));
 //use webHelper.MapPath instead of HostingEnvironment.MapPath which is not available in unit tests
 customCommands.AddRange(ParseCommands(HostingEnvironment.MapPath("~/App_Data/SqlServer.StoredProcedures.sql"), false)); 

 var initializer = new CreateTablesIfNotExist<NopObjectContext>(tablesToValidate, customCommands.ToArray());
 Database.SetInitializer(initializer);
} 

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, entityframework
nopcommerce
nopcommerce 数据库、nopcommerce 数据库表、nopcommerce 多数据库、nopcommerce、nopcommerce教程,以便于您获取更多的相关知识。

时间: 2024-10-25 06:21:28

NopCommerce架构分析之(三)EntityFramework数据库初试化及数据操作_自学过程的相关文章

NopCommerce架构分析之(四)基于路由实现灵活的插件机制_自学过程

NopCommerce支持灵活的插件机制,所谓Web系统插件,其实也就是可以像原系统的一部分一样使用. Web系统的使用方式就是客户端发送一个请求,服务端进行解析.在asp.net MVC中对客户请求的解析是通过路由的方式实现的. 所谓路由就是在客户端发生请求时,对请求路径的解析过程. 在Global.asax.cs中注册所有路由类: //register custom routes (plugins, etc) var routePublisher = EngineContext.Curren

NopCommerce架构分析之(八)多语言支持_自学过程

系统支持的语言是有类:Language表示: 多语言资源对应的类为:LocalizedProperty: 当先选择某种语言存储在类中:GenericAttribute: 多语言可以导出为XML文件,当然也支持导出. IWorkContext及其实体类WebWorkContext为当前运行上下文:用户的登录信息以及一些上下文环境设置都保存在此类中. 具体包括:当前用户信息:CurrentCustomer:当前用户Cookie:货币:语言:税的类型:供应商等: 展现多语言资源的方式有几种: 一.在自

NopCommerce架构分析之(五)Model绑定Action参数_自学过程

asp.net MVC中Action参数不只是一些基本类型,也支持实体参数.那么从客户端传来的数据如何映射或转换成实体对象呢?就是通过实体绑定类ModelBinder.此系列类在请求转化为后台Controller的Action方法前,捕获传递过来的数据,并对其进行解析和转换,最终为实体类对象. 在系统启动前,Global.asax.cs中的方法Application_Start方法调用下面代码定义参数转换规则. //model binders ModelBinders.Binders.Add(t

NopCommerce架构分析(一)Autofac依赖注入类生成容器_自学过程

NopCommerce为了实现松耦合的框架设计目的,使用了IOC框架:Autofac.据有人测试,Autofac是性能很好的IOC工具. 1.在IOC中,组件首先需要在IOC中注册,有通过配置文件注册的.像Spring.net,也有通过特性注册的,像StructureMap,也有通过代理来注册的,像Autofac.但是IOC讲究一个原则,就是接口和实现分离.所有IOC就是生命某个具体类实现了某个接口.然后在使用时,系统从IOC中获取接口的实现类,并创建对象. 2.下面来看NopCommerce如

NopCommerce架构分析之(七)主题Theme皮肤管理器_自学过程

IThemeContext:皮肤上下文,支持桌面皮肤和移动段皮肤.其实体类为:ThemeContext; IThemeProvider:皮肤提供者,其实体类为ThemeProvider;皮肤提供者从皮肤配置文件中解析配置项,加载系统提供的所有皮肤方案,系统默认提供桌面干净皮肤(~/Themes/DefaultClean)和移动端皮肤(~/Themes/Mobile).ThemeConfiguration是对theme.config数据的解析对象. IThemeContext从IThemeProv

《解剖PetShop》之一:PetShop的系统架构设计_自学过程

前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有许多.Net与J2EE之争,许多数据是从微软的PetShop和Sun的PetStore而来.这种争论不可避免带有浓厚的商业色彩,对于我们开发人员而言,没有必要过多关注.然而PetShop随着版本的不断更新,至现在基于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处.PetShop是一个小型的项目,系统架构与代码都比较简单,却也凸现了许多颇有价值的设计与开发理念.本系列试图对

在ASP.NET 2.0中操作数据之五十七:在分层架构中缓存数据_自学过程

导言: 正如前面章节所言,缓存ObjectDataSource的数据只需要简单的设置一些属性.然而,它是在表现层对数据缓存,这就与ASP.NET page页面缓存策略(caching policies)紧密的耦合(tightly couples)起来.我们对体系机构分层的原因之一便是打破这种耦合.拿业务逻辑层为例,将业务逻辑从ASP.NET页面脱离出来:而数据访问层将数据访问的细节ASP.NET页面脱离出来.从某种意义来说,将业务逻辑和数据访问细节脱离出来是首先,这样的话使系统更易读.易维护.易

在ASP.NET 2.0中操作数据之六十一:在事务里对数据库修改进行封装_自学过程

导言: 正如我们在第16章<概述插入.更新和删除数据>里探讨的那样,GridView控件内建的功能支持对每行数据的编辑和删除功能,你只需要稍稍动一下鼠标就可以创建丰富的数据修改界面而不用写一行代码.但是,在某些情况下,这还不够,我们需要让用户能够成批地处理数据. 比如,很多基于web(web-based)的电子邮件客户端,将所有邮件出来,每条邮件除了包含邮件信息(主题.发送者等)外,还包含一个checkbox控件.这些界面允许用户同时删除多个邮件,用户只需要选中邮件,再点"删除所选邮

ASP.NET中数据库操作初步_自学过程

一.定义OleDbCommand类型变量:MyCommand 要对数据库进行增加.删除.修改的操作我们还需要根据MyConnectio的类型定义一个OleDbCommand或者SqlCommand对象(请注意如果MyConnection是OleDbConnection类型,那么只能用OleDbCommand:如果MyConnection是SqlConnection类型,那么那么只能用SqlCommand.这里假设MyConnection是OleDbConnection类). 方法一 你可以象拖放