从 EF6 迁移到 Entity Framework Core(EF Core)是一项涉及技术和架构调整的任务,尤其对于已经使用 EF6 构建的应用程序来说。EF Core 作为新一代的 ORM 框架,提供了更好的性能、跨平台支持以及更丰富的特性。本文将以代码示例/片段的形式,详细介绍如何从 EF6 平滑过渡到 EF Core,并通过具体的代码示例展示其实现过程。
首先,我们需要创建一个基于 EF6 的现有项目,并逐步将其迁移到 EF Core。打开 Visual Studio,创建一个新的 .NET Framework 控制台应用程序,并选择模板创建项目。接着,添加 EF6 相关的 NuGet 包,如 EntityFramework
。
配置 EF6 数据库上下文
在 Models
文件夹中,创建一个 BlogContext
类,用于定义数据库上下文。
using System.Data.Entity;
namespace YourProjectName.Models
{
public class BlogContext : DbContext
{
public DbSet<Blog> Blogs {
get; set; }
public DbSet<Post> Posts {
get; set; }
}
}
定义领域模型
在 Models
文件夹中,定义两个实体类 Blog
和 Post
。
namespace YourProjectName.Models
{
public class Blog
{
public int BlogId {
get; set; }
public string Url {
get; set; }
public DateTime CreatedAt {
get; set; }
public virtual ICollection<Post> Posts {
get; set; }
}
public class Post
{
public int PostId {
get; set; }
public string Title {
get; set; }
public string Content {
get; set; }
public int BlogId {
get; set; }
public virtual Blog Blog {
get; set; }
}
}
使用 EF6 进行数据操作
在 Program.cs
文件中,编写如下代码来添加数据:
using System;
using System.Linq;
using YourProjectName.Models;
namespace YourProjectName
{
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<BlogContext>());
using (var context = new BlogContext())
{
// 添加一些测试数据
context.Blogs.AddRange(
new Blog {
Url = "http://example.com/blog1", CreatedAt = DateTime.Parse("2020-01-01"), Posts = new List<Post>
{
new Post {
Title = "First Post", Content = "Content of the first post." },
new Post {
Title = "Second Post", Content = "Content of the second post." }
}},
new Blog {
Url = "http://example.com/blog2", CreatedAt = DateTime.Parse("2021-01-01"), Posts = new List<Post>
{
new Post {
Title = "Third Post", Content = "Content of the third post." }
}}
);
context.SaveChanges();
}
}
}
}
迁移到 EF Core
要迁移到 EF Core,首先需要创建一个新项目或新目录,并添加 EF Core 相关的 NuGet 包,如 Microsoft.EntityFrameworkCore.SqlServer
和 Microsoft.EntityFrameworkCore.Tools
。
配置 EF Core 数据库上下文
在新的项目或目录中,创建一个 BlogContext
类,用于定义数据库上下文。
using Microsoft.EntityFrameworkCore;
namespace YourProjectName.Models
{
public class BlogContext : DbContext
{
public BlogContext(DbContextOptions<BlogContext> options)
: base(options)
{
}
public DbSet<Blog> Blogs {
get; set; }
public DbSet<Post> Posts {
get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Blog>()
.HasMany(b => b.Posts)
.WithOne(p => p.Blog)
.HasForeignKey(p => p.BlogId);
modelBuilder.Entity<Blog>()
.HasData(
new Blog {
BlogId = 1, Url = "http://example.com/blog1", CreatedAt = DateTime.Parse("2020-01-01") },
new Blog {
BlogId = 2, Url = "http://example.com/blog2", CreatedAt = DateTime.Parse("2021-01-01") }
);
modelBuilder.Entity<Post>()
.HasData(
new Post {
PostId = 1, Title = "First Post", Content = "Content of the first post.", BlogId = 1 },
new Post {
PostId = 2, Title = "Second Post", Content = "Content of the second post.", BlogId = 1 },
new Post {
PostId = 3, Title = "Third Post", Content = "Content of the third post.", BlogId = 2 }
);
}
}
}
定义领域模型
在 Models
文件夹中,定义两个实体类 Blog
和 Post
。这些实体类与 EF6 版本相同。
连接数据库
在 Startup.cs
文件中配置 EF Core 的连接字符串。
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BlogContext>(options =>
options.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCoreMigration;Trusted_Connection=True;"));
}
使用 EF Core 进行数据操作
在 Program.cs
文件中,编写如下代码来添加数据:
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using YourProjectName.Models;
namespace YourProjectName
{
class Program
{
static void Main(string[] args)
{
var options = new DbContextOptionsBuilder<BlogContext>()
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFCoreMigration;Trusted_Connection=True;")
.Options;
using (var context = new BlogContext(options))
{
// 添加一些测试数据
context.Blogs.AddRange(
new Blog {
Url = "http://example.com/blog1", CreatedAt = DateTime.Parse("2020-01-01"), Posts = new List<Post>
{
new Post {
Title = "First Post", Content = "Content of the first post." },
new Post {
Title = "Second Post", Content = "Content of the second post." }
}},
new Blog {
Url = "http://example.com/blog2", CreatedAt = DateTime.Parse("2021-01-01"), Posts = new List<Post>
{
new Post {
Title = "Third Post", Content = "Content of the third post." }
}}
);
context.SaveChanges();
}
}
}
}
迁移数据库模式
使用 EF Core 的迁移工具来生成和应用数据库迁移。
dotnet ef migrations add InitialCreate
dotnet ef database update
查询数据
在 Program.cs
文件中,添加查询数据的代码:
// 在 Main 方法中添加以下代码
using (var context = new BlogContext(options))
{
var blogs = context.Blogs.Include(b => b.Posts).ToList();
foreach (var blog in blogs)
{
Console.WriteLine($"Blog URL: {blog.Url}");
foreach (var post in blog.Posts)
{
Console.WriteLine($" Post Title: {post.Title}");
}
}
}
总结
通过上述步骤,我们展示了如何从 EF6 平滑过渡到 EF Core。从配置数据库上下文到定义领域模型,再到实现和使用 EF Core 的数据操作,每个环节都体现了如何利用 EF Core 的强大功能来处理复杂的数据访问需求。希望本文提供的示例代码和技术指南能够帮助你在实际项目中更好地应用这些技术,构建出高效且功能丰富的数据访问层。
迁移到 EF Core 不仅能够带来性能上的提升,还能享受到跨平台支持和持续的更新维护。结合 EF Core 的强大功能,我们可以构建出高度灵活且易于扩展的数据访问层,从而提高生产力并降低维护成本。