This article shows how to access MySQL data using an Entity Framework code-first approach. Entity Framework 6 is available in .NET 4.5 and above.
Entity Framework is an object-relational mapping framework that can be used to work with data as objects. While you can run the ADO.NET Entity Data Model wizard in Visual Studio to handle generating the Entity Model, this approach, the model-first approach, can put you at a disadvantage if there are changes in your data source or if you want more control over how the entities operate. In this article you will complete the code-first approach to accessing MySQL data using the CData ADO.NET Provider.
- Open Visual Studio and create a new Windows Form Application. This article uses a C# project with .NET 4.5.
- Run the command 'Install-Package EntityFramework' in the Package Manger Console in Visual Studio to install the latest release of Entity Framework.
Modify the App.config file in the project to add a reference to the MySQL Entity Framework 6 assembly and the connection string.
The Server and Port properties must be set to a MySQL server. If IntegratedSecurity is set to false, then User and Password must be set to valid user credentials. Optionally, Database can be set to connect to a specific database. If not set, tables from all databases will be returned.
<configuration> ... <connectionStrings> <add name="MySQLContext" connectionString="Offline=False;User=myUser;Password=myPassword;Database=NorthWind;Server=myServer;Port=3306;" providerName="System.Data.CData.MySQL" /> </connectionStrings> <entityFramework> <providers> ... <provider invariantName="System.Data.CData.MySQL" type="System.Data.CData.MySQL.MySQLProviderServices, System.Data.CData.MySQL.Entities.EF6" /> </providers> <entityFramework> </configuration> </code>- Add a reference to System.Data.CData.MySQL.Entities.EF6.dll, located in the lib -> 4.0 subfolder in the installation directory.
- Build the project at this point to ensure everything is working correctly. Once that's done, you can start coding using Entity Framework.
- Add a new .cs file to the project and add a class to it. This will be your database context, and it will extend the DbContext class. In the example, this class is named MySQLContext. The following code example overrides the OnModelCreating method to make the following changes:
- Remove PluralizingTableNameConvention from the ModelBuilder Conventions.
- Remove requests to the MigrationHistory table.
- Create another .cs file and name it after the MySQL entity you are retrieving, for example, Orders. In this file, define both the Entity and the Entity Configuration, which will resemble the example below: using System.Data.Entity.ModelConfiguration; using System.ComponentModel.DataAnnotations.Schema; [System.ComponentModel.DataAnnotations.Schema.Table("Orders")] public class Orders { [System.ComponentModel.DataAnnotations.Key] public System.String ShipName { get; set; } public System.String Freight { get; set; } }
- Now that you have created an entity, add the entity to your context class: public DbSet<Orders> Orders { set; get; }
- With the context and entity finished, you are now ready to query the data in a separate class. For example: MySQLContext context = new MySQLContext(); context.Configuration.UseDatabaseNullSemantics = true; var query = from line in context.Orders select line;
Entity Framework Extensions EF6 - MySql Provider
MySQL is an open-source relational database management system (RDBMS) and it is known for its quick processing, proven reliability, ease and flexibility of use.
- It is a database system used on the web and is ideal for both small and large applications.
- It is an essential part of almost every open source PHP application.
Install EFE
Let's create a new application using the Console App (.NET Framework) template and install Z.EntityFramework.Extensions.
Entity Framework Extensions (EFE) library is available as a nuget package and you can install it using Nuget Package Manager.
In the Package Manager Console window, enter the following command.
PM> Install-Package Z.EntityFramework.Extensions
You can also install EFE by right-clicking on your project in Solution Explorer and select Manage Nuget Packages....
Search for Z.EntityFramework.Extensions and install the latest version by pressing the install button.
Register EF Provider
EF providers can be registered using either code-based configuration or in the application's config file. Install the MySql.Data.Entity NuGet package to add this reference automatically within app.config or web.config file during the installation.
PM> Install-Package MySql.Data.Entity
Let's open the App.config file.
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> </providers> </entityFramework> </configuration>
Note that often if the EF provider is installed from NuGet, then the NuGet package will automatically add this registration to the config file.
- The invariantName in this registration is the same invariant name used to identify an ADO.NET provider. The invariant name MySql.Data.MySqlClient is for MySql.
- The type in this registration is the assembly-qualified name of the provider type that derives from MySql.Data.MySqlClient.MySqlProviderServices. For example, the string MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d here is used for MySql.
Configuration
Set the new DbConfiguration class for MySQL. This step is optional but highly recommended because it adds all the dependency resolvers for MySQL classes and this can be done in three ways.
- Add the DbConfigurationTypeAttribute on the context class.
[DbConfigurationType(typeof(MySqlEFConfiguration))]
Call DbConfiguration.SetConfiguration(new MySqlEFConfiguration()) at the application start up.
You can also set the DbConfiguration type in the configuration file.
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
You are now ready to start your application.
Create Data Model
Model is a collection of classes to interact with the database.
- A model stores data that is retrieved according to the commands from the Controller and displayed in the View.
- It can also be used to manipulate the data to implement the business logic.
To create a data model for our application, we will start with the following two entities.
public class Author { public int AuthorId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } public List<Book> Books { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } public Author Author { get; set; } }
There's a one-to-many relationship between Author and Book entities. In other words, an author can write any number of books, and a book can be written by only one author.
Create Database Context
The database context class provides the main functionality to coordinate Entity Framework with a given data model.
- You create this class by deriving from the System.Data.Entity.DbContext class.
- In your code, you specify which entities are included in the data model.
- You can also customize certain Entity Framework behavior.
So, let's add a new BookStore class which will inherit the DbContext class.
public class BookStore : DbContext { public BookStore() : base("BookStoreContext") { } public DbSet<Author> Authors { get; set; } public DbSet<Book> Books { get; set; } }
This code creates a DbSet property for each entity set. In Entity Framework terminology, an entity set typically corresponds to a database table, and an entity corresponds to a row in the table.
Setup Database
The name of the connection string is passed into the constructor of the context class.
public BookStore() : base("BookStoreContext") { }
So, let's open the application App.config file and add a connectionStrings element.
<connectionStrings> <add name="BookStoreContext" connectionString="server=localhost;database=BookStoreDb;uid=root;password=;" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
The above connection string specifies that Entity Framework will use a localhost database named BookStoreDb.
Now, we are done with the required classes, so let's add some authors and books records to the database and then retrieve it.
using (var context = new BookStore()) { context.Database.Delete(); var authors = new List<Author> { new Author { FirstName ="Carson", LastName ="Alexander", BirthDate = DateTime.Parse("1985-09-01"), Books = new List<Book>() { new Book { Title = "Introduction to Machine Learning"}, new Book { Title = "Advanced Topics in Machine Learning"}, new Book { Title = "Introduction to Computing"} } }, new Author { FirstName ="Meredith", LastName ="Alonso", BirthDate = DateTime.Parse("1970-09-01"), Books = new List<Book>() { new Book { Title = "Introduction to Microeconomics"} } }, new Author { FirstName ="Arturo", LastName ="Anand", BirthDate = DateTime.Parse("1963-09-01"), Books = new List<Book>() { new Book { Title = "Calculus I"}, new Book { Title = "Calculus II"} } } }; context.BulkInsert(authors, options => options.IncludeGraph = true ); } using (var context = new BookStore()) { var list = context.Authors .Include(a => a.Books) .ToList(); foreach (var author in list) { Console.WriteLine(author.FirstName + " " + author.LastName); foreach (var book in author.Books) { Console.WriteLine("\t" + book.Title); } } }
If you run the application, you will see that authors and books are successfully inserted into the database.