使用DotNet Core 1.0与MySQL数据库交互

在本文中,将探讨如何在DotNet Core 1.0平台上使用Entity FrameworkCore与MySQL数据库进行交互。尽管DotNet Core 2.0自2017年8月以来已经发布,但仍然会关注1.0版本,以便为那些仍然使用旧版本的开发者提供帮助。

准备工作

首先,确保使用的是Windows 10操作系统和Visual Studio 2017 Community Edition。如果还在使用Visual Studio 2015或更早的版本,建议升级到2017社区版,它是免费的。

接下来,需要安装DotNet Core1.0 SDK。可以通过运行开发者命令提示符并输入命令dotnet --version来检查是否已安装。如果未安装,可以通过控制面板中的“添加/删除程序”修改Visual Studio安装,或者直接运行appwiz.cpl

此外,需要在网络或本地开发机器上运行MySQL。可以从免费下载MySQL。

然后,需要创建一个示例数据库。下载的ZIP文件中包含了数据库文件sampledb.sql。在MySQL Workbench中打开并运行它,以便准备示例数据库。

代码优先还是数据库优先

关于是先创建数据库还是先创建域类(例如C#),这个争论已经消耗了无数的生命和时间。在代码优先的方法中,首先定义实体及其关系,然后使用Entity Framework的数据库生成功能来创建数据库。

数据库优先的方法中,首先定义数据库,然后可以使用像Visual Studio EDMX设计器这样的工具,通过拖放数据库中的表到IDE中,然后生成所需的实体类并建模关系。这里的问题是,Entity FrameworkCore没有现成的EDMX设计器。

在本文中,将采取先创建数据库然后手动建模实体类的方法。

准备项目

如果在Visual Studio中创建一个新的DotNet Core项目,一旦项目创建完成,第一件事就是添加Nuget包引用到正确的MySQL数据提供程序和EF提供程序。

在Nuget包管理器控制台中,输入以下命令:

Install-Package MySql.Data.Core -version 7.0.4-IR-191 Install-Package MySql.Data.EntityFrameworkCore -version 7.0.4-IR-191

这将拉取使用EF Core与MySQL一起工作所需的一切。

从小处开始

将首先建模博客到评论的关系,这是一个一对多的关系;一个博客可以有多个评论,一个评论属于一个且仅一个博客。

需要注意的重要事项包括:

  • Blog类包含一个Comment对象的集合。
  • Comment类包含BlogId,它提供了到博客的外键路径。
  • Comment类还包含对相关Blog对象的引用。

接下来重要的是要建模这种关系,以便EF知道Blog和Comment是如何相关的。要做到这一点,需要在DbContext的OnConfiguring方法中进行如下操作:

// 示例代码 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySql("your_connection_string_here"); }

让尝试添加一个新博客并附带2条评论。构建示例应用程序,并确保已经修改了BlogDbContext类中的GetConnectionString方法,以便正确连接到MySQL实例。要填充示例博客,运行程序并输入命令:

dotnet blogsample -populate

希望没有异常。现在可以使用以下命令检索已填充的内容:

dotnet blogsample

输出:

// 示例输出 // ...

更大的模型

最后,将建模博客和类别之间存在的多对多关系。像上次一样,首先定义类并修改现有类的某些属性。

需要注意的重要点:

  • 有一个名为BlogCategory的类,它包含Blog和Category的外键。
  • 它还包含对Blog和Category对象的引用。
  • Blog类现在持有一个BlogCategory对象的集合。
  • Category类持有一个BlogCategory对象的集合。

接下来,需要告诉EF博客和类别之间的关系。像上次一样,这是在DbContext派生类的OnConfiguring方法中完成的:

// 示例代码 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(b => b.BlogsCategories) .WithOne() .HasForeignKey(bc => bc.BlogId); modelBuilder.Entity() .HasMany(c => c.BlogsCategories) .WithOne() .HasForeignKey(bc => bc.CategoryId); }

使用以下流畅的语法从博客中检索类别和评论:

foreach (Blog blog in db.Blogs.Include(b => b.Comments).Include(b => b.BlogsCategories).ThenInclude(bg => bg.Category)) { Console.WriteLine(blog); Console.WriteLine(); }

要填充类别和一个示例博客,使用-populatecategories选项运行程序。如果现在运行程序而不带任何参数,会看到之前的博客加上新的带有示例SQL类别的博客。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485