Jupyter AI

19 数据访问之使用Entity Framework Core

📅 发表日期: 2024年8月15日

分类: 🌐ASP.NET Core 入门

👁️阅读: --

在我们的ASP.NET Core框架入门教程中,上一节我们学习了依赖注入如何帮助我们管理依赖关系以及如何提高代码的可测试性。在本节中,我们将深入探讨如何使用Entity Framework Core来进行数据访问。Entity Framework Core(简称EF Core)是一个现代的对象关系映射(ORM)框架,通过它我们可以轻松地与数据库进行交互。

什么是Entity Framework Core?

Entity Framework Core是一个轻量级、可扩展的开源ORM框架,适用于.NET应用程序。它使得开发者能够使用C#代码与数据库进行交互,而无需编写复杂的SQL查询。

配置Entity Framework Core

安装NuGet包

在使用Entity Framework Core前,我们需要安装相关的NuGet包。我们可以通过NuGet包管理器或命令行工具来安装。以下是使用命令行安装SQL Server提供程序和EF Core的命令:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools

创建DbContext

DbContext是与数据库交互的主要类。在我们的示例中,我们将创建一个BlogDbContext,用于描述我们的博客应用程序。

public class BlogDbContext : DbContext
{
    public BlogDbContext(DbContextOptions<BlogDbContext> options) : base(options) { }

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public List<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 Blog Blog { get; set; }
}

注册DbContext到依赖注入容器

确保在Startup.cs文件中将DbContext注册到依赖注入容器中。这可以在ConfigureServices方法中完成:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BlogDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    
    // 其他服务
    services.AddControllersWithViews();
}

配置数据库连接字符串

appsettings.json中添加数据库连接字符串:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=BlogDatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  // 其他配置
}

使用Entity Framework Core执行CRUD操作

接下来,让我们在一个控制器中使用Entity Framework Core进行CRUD(创建、读取、更新、删除)操作。

创建控制器

using Microsoft.AspNetCore.Mvc;
using System.Linq;

public class BlogsController : Controller
{
    private readonly BlogDbContext _context;

    public BlogsController(BlogDbContext context)
    {
        _context = context;
    }

    public IActionResult Index()
    {
        var blogs = _context.Blogs.ToList();
        return View(blogs);
    }

    [HttpPost]
    public IActionResult Create(Blog blog)
    {
        if (ModelState.IsValid)
        {
            _context.Blogs.Add(blog);
            _context.SaveChanges();
            return RedirectToAction(nameof(Index));
        }
        
        return View(blog);
    }

    public IActionResult Edit(int id)
    {
        var blog = _context.Blogs.SingleOrDefault(b => b.BlogId == id);
        if (blog == null)
        {
            return NotFound();
        }
        return View(blog);
    }

    [HttpPost]
    public IActionResult Edit(Blog blog)
    {
        if (ModelState.IsValid)
        {
            _context.Blogs.Update(blog);
            _context.SaveChanges();
            return RedirectToAction(nameof(Index));
        }
        return View(blog);
    }
    
    public IActionResult Delete(int id)
    {
        var blog = _context.Blogs.SingleOrDefault(b => b.BlogId == id);
        if (blog == null)
        {
            return NotFound();
        }
        _context.Blogs.Remove(blog);
        _context.SaveChanges();
        return RedirectToAction(nameof(Index));
    }
}

使用Razor视图展示数据

Views/Blogs/Index.cshtml中,我们可以展示博客列表:

@model IEnumerable<Blog>

<h2>Blogs</h2>

<table>
    <thead>
        <tr>
            <th>BlogId</th>
            <th>Url</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
    @foreach (var blog in Model)
    {
        <tr>
            <td>@blog.BlogId</td>
            <td>@blog.Url</td>
            <td>
                <a asp-action="Edit" asp-route-id="@blog.BlogId">Edit</a>
                <form asp-action="Delete" asp-route-id="@blog.BlogId" method="post" style="display:inline;">
                    <button type="submit">Delete</button>
                </form>
            </td>
        </tr>
    }
    </tbody>
</table>

<a asp-action="Create">Create New</a>

小结

在本节中,我们学习了如何使用Entity Framework Core进行数据访问。我们创建了DbContext,配置了数据库连接,执行了基本的CRUD操作。这些知识为我们后续更复杂的数据库迁移打下了基础。在下一节中,我们将讨论如何进行数据库迁移,管理数据模式的演变。

助于确保代码的可维护性和可扩展性,Entity Framework Core为我们提供了强大的功能,使得开发者能够更加高效地管理应用程序的数据层。