在本文中,将探讨如何在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一起工作所需的一切。
将首先建模博客到评论的关系,这是一个一对多的关系;一个博客可以有多个评论,一个评论属于一个且仅一个博客。
需要注意的重要事项包括:
接下来重要的是要建模这种关系,以便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
输出:
// 示例输出
// ...
最后,将建模博客和类别之间存在的多对多关系。像上次一样,首先定义类并修改现有类的某些属性。
需要注意的重要点:
接下来,需要告诉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类别的博客。