Everton Bezerra
Everton Bezerra

Reputation: 51

Change the connection string of nopCommerce?

I am using nopCommerce and I need to remove the connection string in the settings.txt file and insert the web.config file. How can i do this?

Upvotes: 5

Views: 4626

Answers (5)

Bill Murray
Bill Murray

Reputation: 21

[1] In .NET Core (3.1 | NopCommerce 4.3) I created various appsettings.json files (including appsettings.json, appsettings.Development.json, appsettings.Integration.json, appsettings.Staging.json) and logic (beyond this discuss) determines the the correct settings to be used in the proper environment etc.

[2] \nopCommerce\Libraries\Nop.Core\Data\DataSettingsManager.cs I created the following method:

    public static string GetConnectionString()
    {
        var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        string appSettingsFileName = env switch
        {
            "Development" => "appsettings.Development.json",
            "Production" => "appsettings.json",
            "Staging" => "appsettings.Staging.json",
            "Integration" => "appsettings.Integration.json",
            _ => "appsettings.json",
        };

        IConfigurationRoot configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(appSettingsFileName).Build();
        string connectionString = configuration.GetConnectionString("DefaultConnection");

        return connectionString;
    }

(returns the proper connection string for the proper environment)

[3] In LoadSettings -- I didn't change anything to get down to the line

Singleton<DataSettings>.Instance = JsonConvert.DeserializeObject<DataSettings>(text);

... I just added a new line below to replace the .ConnectionString with the connectionstring determined from our new method:

Singleton<DataSettings>.Instance.ConnectionString = GetConnectionString();

important: When I ran it there were three or four places where there was a switch (case > default:) that was looking for a provider etc -- But I just copied the settings from MsSql down to the default: and it worked fine. I know this is sloppy but I am never using MySql for this project and so far as I am concerned its a non-issue. Either way - I broke it to make it work (multiple Azure App environments are more important).

I suggest they should have built it the regular way and just provided us with a SQL script for deployment (over engineered a non-issue?) since we usually have to do that anyway for custom development (seems silly to me to hard code a data settings file in App_Data) - but I trust their logic.

Upvotes: 2

user3774600
user3774600

Reputation: 1416

Just do two steps

  1. Replace two method LoadSettings and SaveSettings in \nopCommerce\Libraries\Nop.Core\Data\DataSettingsManager.cs. Code from link of @Stephen Kiningham

    /// <summary>
    /// Load settings
    /// </summary>
    /// <param name="filePath">File path; pass null to use default settings file path</param>
    /// <returns></returns>
    public virtual DataSettings LoadSettings(string filePath = null)
    {            
        try
        {
            System.Configuration.Configuration webConfig = WebConfigurationManager.OpenWebConfiguration(HttpRuntime.AppDomainAppVirtualPath);
            return new DataSettings
            {
                DataConnectionString = webConfig.ConnectionStrings.ConnectionStrings["DefaultConnection"].ConnectionString,
                DataProvider = webConfig.ConnectionStrings.ConnectionStrings["DefaultConnection"].ProviderName
            };
        }
        catch (NullReferenceException)
        {
            return new DataSettings();
        }
    }
    
    /// <summary>
    /// Save settings to a file
    /// </summary>
    /// <param name="settings"></param>
    public virtual void SaveSettings(DataSettings settings)
    {            
        if (null == settings) throw new ArgumentNullException("settings");
    
        System.Configuration.Configuration webConfig = WebConfigurationManager.OpenWebConfiguration(HttpRuntime.AppDomainAppVirtualPath);
    
        webConfig.ConnectionStrings.ConnectionStrings["DefaultConnection"].ConnectionString = settings.DataConnectionString;
        webConfig.ConnectionStrings.ConnectionStrings["DefaultConnection"].ProviderName = settings.DataProvider;
    
        webConfig.Save();
    }
    
  2. Add connection string to your web config web.config

    <connectionStrings>
        <add name="DefaultConnection"
             connectionString=" Data Source=localhost;Initial Catalog=nopcommerce;Integrated Security=True;Persist Security Info=False"
             providerName="sqlserver">
        </add>
    </connectionStrings>
    

Upvotes: 5

ShadowMinhja
ShadowMinhja

Reputation: 293

In addition to adding the connection to the web.config, you have to specify the providerName="sqlserver".

Ex) ;Initial Catalog=;Integrated Security=False;User ID=;Password=;Connect Timeout=30;Encrypt=True" providerName="sqlserver" />

This is because the EfDataProviderManager in Nop.Data has a check for the provider name, and will throw an exception if you put the normal

providerName="System.Data.SqlClient"

Upvotes: 1

Stephen Kiningham
Stephen Kiningham

Reputation: 504

The most straightforward way to move the connection string out of settings.txt and into the web.config is to modify the Nop.Core.Data.DataSettingsManager. Specifically the LoadSettings() and SaveSettings() methods. You can store the connection string wherever you'd like (ideally in web.config), as long as those two methods read and write the configuration.

A rough example of the DataSettingsManager updated to support storing the connection string in web.config can be found in this Gist: http://git.io/vUPcI Just copy the connection string from settings.txt to web.config and name the connection "DefaultConnection" or adapt the code accordingly.

Upvotes: 5

Omar Ramo
Omar Ramo

Reputation: 21

Please add this to your web.config under Nop.Web project :

<connectionStrings>
<add name="MyConnectionString" 
connectionString="Data Source=serverName;Initial Catalog=DBName;Persist Security Info=False;UserID=userName;Password=password" 
</connectionStrings>

Best Regards.

Upvotes: 1

Related Questions