[转]NopCommerce 多数据库方案

本文转自:http://www.cnblogs.com/YUTOUYUWEI/p/5538200.html

有时候一个项目需要连接多个数据库,以实现不同数据库的数据在同个项目的共享。

如果已经安装了nop,则需要在第二个数据库新建一个表,nop现在无法自动通过迁移来实现第二个或者更多数据库,所以这点需要我们手动去操作。

1、在SQLServer新建一个数据库,我这里新建的是TestDb,表为TestTable。

USE [TestDb]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TestTable](
       [Id] [int] IDENTITY(1,1) NOT NULL,
       [Name] [nvarchar](255) NOT NULL,
       [CreatedOnUtc] [datetime] NULL,
 CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
       [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

2、添加实体,在Nop.Core下的Domain添加一个文件夹OtherDb,在OtherDb添加一个TestTable类,继承BaseEntity

TestTable:

namespace Nop.Core.Domain.OtherDb
{
    public class TestTable : BaseEntity
    {
        public string Name { get; set; }
        public DateTime CreatedOnUtc { get; set; }
    }
}

3、添加映射,在Nop.Data下的Mapping添加一个OtherDb文件夹,在OtherDb添加一个TestTableMap映射类,继承NopEntityTypeConfiguration< TestTable >

TestTableMap:

namespace Nop.Data.Mapping.OtherDb
{
    public class TestTableMap : NopEntityTypeConfiguration<TestTable>
    {
        public TestTableMap()
        {
            ToTable("TestTable");
            HasKey(t => t.Id);
            Property(t => t.Name).IsRequired().HasMaxLength(255);
        }
    }
}

4、添加新的DbContext,在Nop.Data添加一个OhterDb,里面添加一个OtherDbObjectContext类继承DbContext和IDbContext,添加一个OtherDbEfStartUpTask继承IStartTask

OtherDbObjectContext:

namespace Nop.Data.OtherDb
{
    public class OtherDbObjectContext : DbContext, IDbContext
    {
        public OtherDbObjectContext(string nameOrConnectionString)

            : base(nameOrConnectionString)
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new TestTableMap());

            base.OnModelCreating(modelBuilder);
        }

        public string CreateDatabaseScript()
        {
            return ((IObjectContextAdapter)this).ObjectContext.CreateDatabaseScript();
        }

        public new IDbSet<TEntity> Set<TEntity>() where TEntity : Core.BaseEntity
        {
            return base.Set<TEntity>();
        }

        public IList<TEntity> ExecuteStoredProcedureList<TEntity>(string commandText, params object[] parameters) where TEntity : Core.BaseEntity, new()
        {
            throw new NotImplementedException();
        }

        public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters)
        {
            throw new NotImplementedException();
        }

        public int ExecuteSqlCommand(string sql, bool doNotEnsureTransaction = false, int? timeout = null, params object[] parameters)
        {
            throw new NotImplementedException();
        }
        public void Detach(object entity)
        {
            throw new NotImplementedException();
        }
        public bool ProxyCreationEnabled
        {
            get { return this.Configuration.ProxyCreationEnabled; }

            set { this.Configuration.ProxyCreationEnabled = value; }
        }

        public bool AutoDetectChangesEnabled
        {
            get { return this.Configuration.AutoDetectChangesEnabled; }

            set { this.Configuration.AutoDetectChangesEnabled = value; }
        }
    }
}

OtherDbEfStartUpTask:

namespace Nop.Data.OtherDb
{
    public class OtherDbEfStartUpTask : IStartupTask
    {
        public void Execute()
        {
            Database.SetInitializer<OtherDbObjectContext>(null);
        }

        public int Order
        {
            get { return -1000; }
        }
    }}

5、添加新的数据库连接字符串文本文件,用于连接TestDb数据库,在Nop.Web下面的App_Data下面添加一个文本文件命名OtherDbSetting.txt里面添加连接字符串

DataProvider: sqlserver

DataConnectionString: Data Source=.;Initial Catalog=TestDb;Integrated Security=False;Persist Security Info=False;User ID=登陆身份;Password=登陆密码

改变数据库连接名即可

6、在autofac注入新的OtherDbObjectContext,在Nop.WebFramework新建一个OtherDb文件夹,里面添加一个DependencyRegistrar类

DependencyRegistrar:

namespace Nop.Web.Framework.OtherDb
{
    public class DependencyRegistrar : IDependencyRegistrar
    {
        protected virtual string MapPath(string path)
        {
            if (HostingEnvironment.IsHosted)
            {
                return HostingEnvironment.MapPath(path);
            }
            else
            {
                string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;

                path = path.Replace("~/", "").TrimStart(‘/‘).Replace(‘/‘, ‘\\‘);

                return Path.Combine(baseDirectory, path);
            }
        }

        public void Register(ContainerBuilder builder, Core.Infrastructure.ITypeFinder typeFinder, Core.Configuration.NopConfig config)
        {
            var dataSettingManager = new DataSettingsManager();

            var dataProviderSettings = dataSettingManager.LoadSettings(Path.Combine(MapPath("~/App_Data/"), "OtherDbSetting.txt"));

            if (dataProviderSettings != null && dataProviderSettings.IsValid())
            {
                builder.Register<IDbContext>(c => new OtherDbObjectContext(dataProviderSettings.DataConnectionString))

                    .Named<IDbContext>("nop_object_context_otherdb").InstancePerLifetimeScope();

                //builder.Register<OtherDbObjectContext>(
                //    c => new OtherDbObjectContext(dataProviderSettings.DataConnectionString)).InstancePerLifetimeScope();
            }

            else
            {
                builder.Register<IDbContext>(

                    c => new OtherDbObjectContext(c.Resolve<DataSettings>().DataConnectionString)).InstancePerLifetimeScope();

                //builder.Register(

                //    c => new OtherDbObjectContext(c.Resolve<DataSettings>().DataConnectionString))

                //    .InstancePerLifetimeScope();

            }

            builder.RegisterType<EfRepository<TestTable>>()

                .As<IRepository<TestTable>>()

                .WithParameter(ResolvedParameter.ForNamed<IDbContext>("nop_object_context_otherdb"))

                .InstancePerLifetimeScope();
        }

        public int Order
        {
            get { return -1; }
        }
    }
}

全部添加没问题后,添加其他业务实现代码,重新生成解决方案即可。 此方案试用Nop3.4版本及以上,如有跟nop前期或者更新某个版本有差异,请自行斟酌修改。

-- 鱼头鱼尾 QQ:875755898

时间: 2024-12-11 21:47:40

[转]NopCommerce 多数据库方案的相关文章

多租户SaaS平台的数据库方案

1.1 多租户是什么 多租户技术(Multi-TenancyTechnology)又称多重租赁技术:是一种软件架构技术,是实现如何在多用户环境下 (此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性.简单讲: 在一台服务器上运行单个应用实例,它为多个租户(客户)提供服务.从定义中我们可以理解:多租户是一种架 构,目的是为了让多用户环境下使用同一套程序,且保证用户间数据隔离.那么重点就很浅显易懂了,多租户的重 点就是同一套程序下实现多用户数据的隔离 1.2 需

NopCommerce适应多数据库方案

有时候一个项目需要连接多个数据库,以实现不同数据库的数据在同个项目的共享. 如果已经安装了nop,则需要在第二个数据库新建一个表,nop现在无法自动通过迁移来实现第二个或者更多数据库,所以这点需要我们手动去操作. 1.在SQLServer新建一个数据库,我这里新建的是TestDb,表为TestTable. USE [TestDb] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[TestTable](

[DIOCP3/MyBean/QDAC开源项目] DataModule-DB例子基于MyBean的插件实例&lt;三层数据库方案&gt;

[说明] 这个例子答应大家很久了,一直没有时间弄,现在正式结合MyBean插件可以很方便的在客户端共享操作连接,执行数据库的各项工作,屏蔽了底层的通信解码器编码等工作,直接传递Variant,给了开发者足够的领活和自由. [服务端使用技术] diocp3:担当底层的通信任务. qworker/iocpTask:担当业务逻辑的处理工作,diocp3接受数据解码后用qworker/iocpTask将数据包投递出来,这样不用占用通信线程. qmsgpack:负责将传递的将variant数据打包到流,从

mpy开发物联网系列:1.mpy与服务器数据库方案

ini配置文件与非关系型数据库 在使用micropython开发esp32过程中,经常涉及到一些数据的配置读取,而esp32本身micropython难以安装很多数据库客户端的库,只能基于本地文件使用小型库,这个时候使用一些自己的轮子是非常方便的,如使用config.py对本地的ini文件进行配置读取,相当于一个字典操作,可以读取相关wifi配置的信息 config.py import json,os class config(): def __init__(self,fileName): se

发现几种树结构数据库存储方案

最近在开发jSqlBox过程中,研究树形结构的操作,突然发现一种新的树结构数据库存储方案,在网上找了一下,没有找到雷同的(也可能是花的时间不够),现介绍如下: 目前常见的树形结构数据库存储方案有以下四种,但是都存在一定问题: 1)Adjacency List::记录父节点.优点是简单,缺点是访问子树需要遍历,发出许多条SQL,对数据库压力大. 2)Path Enumerations:用一个字符串记录整个路径.优点是查询方便,缺点是插入新记录时要手工更改此节点以下所有路径,很容易出错. 3)Clo

Oracle数据库HA架构方案介绍

摘要:Oracle数据库在各类应用系统中负责存储平台所有的用户数据,数据库的可靠性及安全性直接影响平台的安全运行,目前采用的Oracle Replication方式来实现的数据库高可靠性已经显示出了弊端,本文介绍并分析了目前比较流行的几种数据库高可用性的架构:Oracle Replication.Oracle Rac.Oracle 主机HA等,希望给大家一个参考. 1 什么是高可用性(High  Availability) 高可用(HA)性有两种不同的含义,在广义环境中是指整个系统的高可用性,在

转载:SqlServer数据库性能优化详解

本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量.为达到此目的,需要了解应用程序的需求和数据的逻辑和物理结构,并在相互冲突的数据库使用之间(如联机事务处理 (OLTP) 与决策支持)权衡. 对性能问题的考虑应贯穿于开发阶段的全过程,不应只在最后实现系统时才考虑性能问题.许多使性能得

阿里云数据库产品HybridDB简介——OLAP数据库,支持行列混合存储,为用户提供基于开源 OLTP、OLAP、BigData 生态的一站式解决方案

12 月 9 日,阿里云宣布数据库产品 HybridDB 正式商业化. HybridDB(ApsaraDB HybridDB)是一款在线 MPP 大规模并行处理数据仓库的服务.它基于 Pivotal 公司的开源数据库项目 Greenplum Database 开发,并由阿里云数据库团队在云计算架构下深度扩展. 该服务支持了 OSS 存储.JSON 数据类型.HyperLogLog 预估分析等功能特性.通过符合 SQL2008 标准查询语法及 OLAP 分析聚合函数,提供灵活的混合分析能力.提供在

SharePoint 高可用和备份恢复方案(一, 系统层面的要求与介绍)

 SharePoint 高可用和备份恢复方案(一 SharePoint 层面) 高可用性(High Availability),是指在服务器出现硬件或者网络故障的时候,尽可能不会中断服务,并尽可能减少对用户的影响. SharePoint服务器场本身是一个典型的三层架构(从2007.到2010.2013再到2016,这个基本的架构都是一样的),也就是前端服务器 - 应用服务器 - 数据库服务器.当然随着系统优化和对高可用要求提升,高可用和恢复技术也有所提高. 也许大家都很清楚SharePoin