BlogEngine.NET 1.4 with MySql? Why not?

If you are reading this blog regularly, you are now likely tired of the database themes going on this week.  First, it was SQL Server and BlogEngine.  Then VistaDB Express and BlogEngine.NET complete with download.  Today, I’m moving on to MySql.

Let me start this post by admitting right up front that I have almost zero experience with it.  I didn’t even get it installed until last week and that was just to make sure the BlogEngine.NET could work with it.  So instead of completely embarrassing myself by doing a screencast with something I know nothing about, I figured I’d just write up a guide on how to do get started with BlogEngine and MySql and embarrass myself with text.

Requirements

I’m expecting you have BlogEngine.NET installed with the default settings and providers.  If you need help getting to this point, you should check out my initial installation screencast.

Second, I’m expecting you have a MySql database setup and some administration tool to work with.  If you need help getting to this point, I wish you the very best. :)  Actually, I was truly miserable until Ruslan Tur recommended Toad for an admin tool.  This made my experience much, much better.

Creating a Database

You’ll need to create a database or have a database to put the BlogEngine table in.  I have created a script to get the initial tables and data created for you.  Just execute it against the database you want to use for BlogEngine.NET.  Download the script here.

Add the MySQL dll to your bin folder

You’ll need to download the MySQL Connector/NET 5.1, find the MySql.Data.dll, and added to your bin folder.

Update your web.config

I’m including a sample web.config for you to download, but I’ll go through the changes here. (Download Sample web.config.)

First, we need to let BlogEngine know about this new MySQL dll we just added.  This is done by adding the assembly to the list of assemblies and then adding in the system.data section to let BlogEngine know where it will find the MySQL DBProviderFactory.

   1: <system.data>
   2:     <DbProviderFactories>
   3:         <clear />
   4:         <add name="MySQL Data Provider" 
   5:              invariant="MySql.Data.MySqlClient" 
   6:              description=".Net Framework Data Provider for MySQL"  
   7:              type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=5.1.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
   8:     </DbProviderFactories>
   9: </system.data>
  10: <system.web>
  11:     <compilation debug="false">
  12:         <assemblies>
  13:             <add assembly="MySql.Data, Version=5.1.6.0, Culture=neutral, PublicKeyToken=C5687FC88969C44D"/>
  14:             <add assembly="System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
  15:             <add assembly="System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
  16:             <add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  17:             <add assembly="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  18:             <add assembly="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
  19:             <add assembly="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
  20:             <add assembly="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  21:         </assemblies>
  22:     </compilation>
  23:     < ....snip..../>
  24: </system.web>

Then, you will need to add your connection string to your connectionString section.

   1: <connectionStrings>
   2:         <clear/>
   3:         <add name="LocalSqlServer" connectionString="dummy"/>
   4:         <!-- Mono complains if LocalSqlServer isn't specified -->
   5:         <add name="BlogEngine" 
   6:              connectionString="Data Source=MySQLServer;User ID=user;Password=password;persist security info=False;initial catalog=BlogEngine;" 
   7:              providerName="System.Data.SqlClient"/>
   8:         <add name="MySQLDB" 
   9:              connectionString="Server=localhost;Database=blogengine;Uid=beUser;Pwd=beUser;" 
  10:              providerName="MySql.Data.MySqlClient"/>
  11:     </connectionStrings>

Lastly, we need to link up the BlogProvider, the MembershipProvider, the RoleProvider, and the ProfileProvider.  The BlogProvider section is near the top of your web.config in a BlogEngine section.  The other 2 can be found in in succession down much further in the file.

   1: <BlogEngine>
   2:     <blogProvider defaultProvider="DbBlogProvider">
   3:         <providers>
   4:             <add name="XmlBlogProvider" 
   5:                  type="BlogEngine.Core.Providers.XmlBlogProvider, BlogEngine.Core"/>
   6:             <add name="DbBlogProvider" 
   7:                  type="BlogEngine.Core.Providers.DbBlogProvider, BlogEngine.Core" 
   8:                  connectionStringName="MySQLDB" 
   9:                  parmPrefix="?"/>
  10:         </providers>
  11:     </blogProvider>
  12: </BlogEngine>

 

   1: <profile enabled="true" defaultProvider="DbProfileProvider" inherits="BlogEngine.Core.Web.AuthorProfile" automaticSaveEnabled="false">
   2:     <providers>
   3:         <add name="XmlProfileProvider" 
   4:              type="BlogEngine.Core.Providers.XmlProfileProvider, BlogEngine.Core"/>
   5:         <add name="DbProfileProvider" 
   6:              type="BlogEngine.Core.Providers.DbProfileProvider, BlogEngine.Core" 
   7:              connectionStringName="MySQLDB" 
   8:              parmPrefix="?" />
   9:     </providers>
  10: </profile>
  11: <membership defaultProvider="DbMembershipProvider">
  12:     <providers>
  13:         <clear/>
  14:         <add name="XmlMembershipProvider" 
  15:              type="BlogEngine.Core.Providers.XmlMembershipProvider, BlogEngine.Core" 
  16:              description="XML membership provider" 
  17:              passwordFormat="Hashed"/>
  18:         <add name="SqlMembershipProvider" 
  19:              type="System.Web.Security.SqlMembershipProvider" 
  20:              connectionStringName="BlogEngine" 
  21:              applicationName="BlogEngine"/>
  22:         <add name="DbMembershipProvider" 
  23:              type="BlogEngine.Core.Providers.DbMembershipProvider, BlogEngine.Core" 
  24:              passwordFormat="Hashed" 
  25:              connectionStringName="MySQLDB" 
  26:              parmPrefix="?" />
  27:     </providers>
  28: </membership>
  29: <roleManager defaultProvider="DbRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName=".BLOGENGINEROLES">
  30:     <providers>
  31:         <clear/>
  32:         <add name="XmlRoleProvider" 
  33:              type="BlogEngine.Core.Providers.XmlRoleProvider, BlogEngine.Core" 
  34:              description="XML role provider"/>
  35:         <add name="SqlRoleProvider" 
  36:              type="System.Web.Security.SqlRoleProvider" 
  37:              connectionStringName="BlogEngine" 
  38:              applicationName="BlogEngine"/>
  39:         <add name="DbRoleProvider" 
  40:              type="BlogEngine.Core.Providers.DbRoleProvider, BlogEngine.Core" 
  41:              connectionStringName="MySQLDB" 
  42:              parmPrefix="?" />
  43:     </providers>
  44: </roleManager>

Configuration

Once you have these changes made, you can browse out to your web site and you should be greeted by a new welcome message.  Just as with the SQL Server setup, you’ll be missing your widgets.  So you can login with user “admin” and password “admin”.  Add your Administration widget and then refresh your page to see the full menu.

At this point, you should add users and change the admin password.

It really is fairly easy to get set up especially since you can copy and paste the new sections out of my sample web.config.  I also wanted to start that I save a bit of time getting the install script done by starting with the script I found as part of this post by Mr. Wize.  I added the new tables and initial data, but the initial work was done by him.