4.7.2.1 在 EF Core 中使用代码优先创建数据库

Code First 方法使您能够在代码中定义实体模型,从模型创建数据库,然后将数据添加到数据库中。MySQL Connector/NET 与多个版本的 Entity Framework Core 兼容。有关特定的兼容性信息,请参阅 表 4.4,“连接器/NET 版本和 Entity Framework Core 支持”

以下示例显示了从现有代码创建数据库的过程。尽管此示例使用 C# 语言,但您可以使用任何 .NET 语言并在 Windows、macOS 或 Linux 上运行生成的应用程序。

  1. 为此示例创建一个控制台应用程序。

    1. 使用 .NET Core 命令行界面 (CLI) 初始化有效的 .NET Core 项目和控制台应用程序,然后切换到新创建的文件夹 ( mysqlefcore)。

      dotnet new console –o mysqlefcore
      cd mysqlefcore
    2. MySql.EntityFrameworkCore 使用 dotnet CLI 或 Visual Studio 中 的包管理器控制台 将包添加到应用程序。

      点网命令行

      输入以下命令以添加 MySQL EF Core 6.0 包以与 Connector/NET 8.0.31 及更高版本一起使用。

      dotnet add package MySql.EntityFrameworkCore --version 6.0.4

      输入以下命令之一以添加 MySQL EF Core 5.0 或 EF Core 3.1 包以用于 Connector/NET 8.0.23 及更高版本。

      dotnet add package MySql.EntityFrameworkCore --version 5.0.16
      dotnet add package MySql.EntityFrameworkCore --version 3.1.24

      对于之前版本的Connector/NET,使用以下命令指定包的版本:

      dotnet add package MySql.Data.EntityFrameworkCore --version 8.0.22
      包管理器控制台

      输入以下命令以添加 MySQL EF Core 6.0 包以与 Connector/NET 8.0.28 及更高版本一起使用。

      Install-Package MySql.EntityFrameworkCore -Version 6.0.4

      输入以下命令之一以添加 MySQL EF Core 5.0 或 EF Core 3.1 包以用于 Connector/NET 8.0.23 及更高版本。

      Install-Package MySql.EntityFrameworkCore -Version 5.0.16
      Install-Package MySql.EntityFrameworkCore -Version 3.1.24

      对于之前版本的Connector/NET,使用以下命令指定包的版本:

      Install-Package MySql.Data.EntityFrameworkCore -Version 8.0.22
    3. 恢复项目文件中指定的依赖项和项目特定工具,如下所示:

      dotnet restore
  2. 创建模型并运行应用程序。

    此示例中的模型将由控制台应用程序使用。LibraryContext它由两个与类(或数据库上下文) 中配置的图书馆相关的实体组成 。

    1. 创建一个名为的新文件LibraryModel.cs ,然后将以下内容BookPublisher类添加到 mysqlefcore命名空间。

      namespace mysqlefcore
      {
        public class Book
        {
          public string ISBN { get; set; }
          public string Title { get; set; }
          public string Author { get; set; }
          public string Language { get; set; }   
          public int Pages { get; set; }
          public virtual Publisher Publisher { get; set; }
        }
      
        public class Publisher
        {
          public int ID { get; set; }
          public string Name { get; set; }
          public virtual ICollection<Book> Books { get; set; }
        }
      }
    2. 创建一个名为的新文件 LibraryContext.cs并添加以下代码。将通用连接字符串替换为适合您的 MySQL 服务器配置的字符串。

      笔记

      MySQL.EntityFrameworkCore.Extensions 命名空间适用于 Connector/NET 8.0.23 及更高版本。较早的连接器版本需要 MySQL.Data.EntityFrameworkCore.Extensions 命名空间。

      using Microsoft.EntityFrameworkCore;
      using MySQL.EntityFrameworkCore.Extensions;
      
      namespace mysqlefcore
      {
        public class LibraryContext : DbContext
        {
          public DbSet<Book> Book { get; set; }
      
          public DbSet<Publisher> Publisher { get; set; }
      
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
          {
            optionsBuilder.UseMySQL("server=localhost;database=library;user=user;password=password");
          }
      
          protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
            base.OnModelCreating(modelBuilder);
      
            modelBuilder.Entity<Publisher>(entity =>
            {
              entity.HasKey(e => e.ID);
              entity.Property(e => e.Name).IsRequired();
            });
      
            modelBuilder.Entity<Book>(entity =>
            {
              entity.HasKey(e => e.ISBN);
              entity.Property(e => e.Title).IsRequired();
              entity.HasOne(d => d.Publisher)
                .WithMany(p => p.Books);
            });
          }
        }
      }

      该类LibraryContex包含要使用的实体,它支持配置模型的特定属性,例如Key所需的列、引用等。

    3. 将以下代码插入现有 Program.cs文件,替换默认的 C# 代码。

      using Microsoft.EntityFrameworkCore;
      using System;
      using System.Text;
      
      namespace mysqlefcore
      {
        class Program
        {
          static void Main(string[] args)
          {
            InsertData();
            PrintData();
          }
      
          private static void InsertData()
          {
            using(var context = new LibraryContext())
            {
              // Creates the database if not exists
              context.Database.EnsureCreated();
      
              // Adds a publisher
              var publisher = new Publisher
              {
                Name = "Mariner Books"
              };
              context.Publisher.Add(publisher);
      
              // Adds some books
              context.Book.Add(new Book
              {
                ISBN = "978-0544003415",
                Title = "The Lord of the Rings",
                Author = "J.R.R. Tolkien",
                Language = "English",
                Pages = 1216,
                Publisher = publisher
              });
              context.Book.Add(new Book
              {
                ISBN = "978-0547247762",
                Title = "The Sealed Letter",
                Author = "Emma Donoghue",
                Language = "English",
                Pages = 416,
                Publisher = publisher
              });
      
              // Saves changes
              context.SaveChanges();
            }
          }
      
          private static void PrintData()
          {
            // Gets and prints all books in database
            using (var context = new LibraryContext())
            {
              var books = context.Book
                .Include(p => p.Publisher);
              foreach(var book in books)
              {
                var data = new StringBuilder();
                data.AppendLine($"ISBN: {book.ISBN}");
                data.AppendLine($"Title: {book.Title}");
                data.AppendLine($"Publisher: {book.Publisher.Name}");
                Console.WriteLine(data.ToString());
              }
            }
          }
        }
      }
    4. 使用以下 CLI 命令恢复依赖关系,然后运行应用程序。

      dotnet restore
      dotnet run

运行应用程序的输出由以下示例表示:

书号:978-0544003415
书名:指环王
出版商:水手图书

书号:978-0547247762
书名:密封的信
出版商:水手图书