1. 首頁
  2. 資料庫作業系統

IStartupTask連線資料庫的方法

IStartupTask連線資料庫的方法

系統啟動時執行任務:IStartupTask,啟動時執行的任務主要是資料庫的初始化和載入。

IStartupTask呼叫IEfDataProvider進行資料庫的初始化。

IEfDataProvider,SqlCeDataProvider:獲取資料連線工廠,不同型別資料庫,連線工廠不同。

介面IStartupTask的實體類EfStartUpTask的實現如下:

public class EfStartUpTask : IStartupTask { public void Execute() { var settings = EngineContext.Current.Resolve(); if (settings != null && settings.IsValid()) { var provider = EngineContext.Current.Resolve(); 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。程式碼如下:

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(); builder.Register(x => new EfDataProviderManager(x.Resolve())).As().InstancePerDependency(); builder.Register(x => (IEfDataProvider)x.Resolve().LoadDataProvider()).As().InstancePerDependency(); builder.Register(x => (IEfDataProvider)x.Resolve().LoadDataProvider()).As().InstancePerDependency(); if (dataProviderSettings != null && dataProviderSettings.IsValid()) { var efDataProviderManager = new EfDataProviderManager(dataSettingsManager.LoadSettings()); var dataProvider = (IEfDataProvider)efDataProviderManager.LoadDataProvider(); dataProvider.InitConnectionFactory(); builder.Register(c => new NopObjectContext(dataProviderSettings.DataConnectionString)).InstancePerHttpRequest(); } else { builder.Register(c => new NopObjectContext(dataSettingsManager.LoadSettings().DataConnectionString)).InstancePerHttpRequest(); } builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();

介面IEfDataProvider 的實體類SqlServerDataProvider的資料庫初始化方法如下

///

/// Set database initializer ///

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

(); //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(tablesToValidate, customCommands.ToArray()); Database.SetInitializer(initializer); }

另外,EntityFramework本事是ORM框架,透過資料庫訪問上下文建立與資料庫的連線及實體與資料表的對應廣西。並透過建立IRepository的泛型實體類來實現對每一種資料的處理,也就是所謂的Dao層。業務邏輯層透過每種實體的資料訪問倉庫Repository來進行資料庫操作。