ASP.NET Core MVC 从入门到精通之数据库

简介: ASP.NET Core MVC 从入门到精通之数据库

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据,路由,页面布局,wwwroot和客户端库,Razor语法等内容,今天继续讲解ASP.NET Core MVC 中EnityFrameworkCore数据库等相关内容,仅供学习分享使用。

EntityFrameworkCore简介

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。

EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:

  • 使 .NET 开发人员能够使用 .NET 对象处理数据库。
  • 无需再像通常那样编写大部分数据访问代码。

创建数据库

在ASP.NET Core MVC项目中,环境搭建常有两种模式:Code First和DB First,在本例中主要采用DB First模式,使用的数据库为SQL Server 2012。首先创建数据库,并命名称MovieDB,然后创建数据表Movie,如下所示:

通过数据库右键进行创建数据库,创建表的语句如下所示:

USE [MovieDB]
GO
/****** Object:  Table [dbo].[Movie]    Script Date: 2023/4/25 23:53:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Movie](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](200) NULL,
    [ReleaseDate] [datetime] NULL,
    [LeadingRole] [varchar](100) NULL,
    [Genre] [varchar](100) NULL,
    [Price] [money] NULL,
    [CreateTime] [datetime] NULL,
    [CreateUser] [varchar](50) NULL,
    [LastEditTime] [datetime] NULL,
    [LastEditUser] [varchar](50) NULL,
 CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

构造测试数据

在测试应用之前,首先在数据表中插入2条测试数据,以便看到效果,如下所示:

创建数据实体

数据库和数据表创建成功后,需要ASP.NET Core MVC项目中创建与数据表对应的实体类MovieEntity,如下所示:

namespace DemoCoreMVC.Entities
{
    /// <summary>
    /// 电影实体
    /// </summary>
    public class MovieEntity
    {
        /// <summary>
        /// 主键唯一标识
        /// </summary>
        public long Id { get; set; }
        /// <summary>
        /// 电影名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 发行时间
        /// </summary>
        public DateTime ReleaseDate { get; set; }
        /// <summary>
        /// 主角
        /// </summary>
        public string LeadingRole { get; set; }
        /// <summary>
        /// 电影类型
        /// </summary>
        public string Genre { get; set; }
        /// <summary>
        /// 票价格
        /// </summary>
        public decimal Price { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }
        /// <summary>
        /// 录入人员
        /// </summary>
        public string CreateUser { get; set; }
        /// <summary>
        /// 最后编辑时间
        /// </summary>
        public DateTime LastEditTime { get; set; }
        /// <summary>
        /// 最后编辑人员
        /// </summary>
        public string LastEditUser { get; set; }
    }
}

创建业务模型

实体用于和数据表进行映射,业务模型用于在控制器和视图之间进行数据的交互,所以为了进行分层和数据隔离,需要创建模块,在本例中模型为Movie,字段名称和Entity保持一致【也可以不一致】。如下所示:

namespace DemoCoreMVC.Models
{
    public class Movie
    {
        /// <summary>
        /// 主键唯一标识
        /// </summary>
        public long Id { get; set; }
        /// <summary>
        /// 电影名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 发行时间
        /// </summary>
        public DateTime ReleaseDate { get; set; }
        /// <summary>
        /// 主角
        /// </summary>
        public string LeadingRole { get; set; }
        /// <summary>
        /// 电影类型
        /// </summary>
        public string Genre { get; set; }
        /// <summary>
        /// 票价格
        /// </summary>
        public decimal Price { get; set; }
    }
}

安装EntityFrameworkCore

在ASP.NET Core MVC项目中,我们使用EntityFrameworkCore操作数据库,需要安装依赖包,通过Nuget包管理器进行安装,目前版本为7.0.5,如下所示:

 

配置SQL Server连接字符串

在appsettings.json中,增加数据库连接字符串,配置ConnectionStrings节点,如下所示:

{
  "ConnectionStrings": {
    "Default": "Server=数据库url;Database=MovieDb;User Id=数据库账号;Password=数据库密码;Trusted_Connection=True;;TrustServerCertificate=true;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

创建DbContext

EntityFrameCore通过DbContext操作数据,所以需要创建属于整个项目的数据上下文,并继承于DbContext,如下所示:

using DemoCoreMVC.Entities;
using Microsoft.EntityFrameworkCore;
namespace DemoCoreMVC
{
    public class MovieDbContext:DbContext
    {
        public MovieDbContext(DbContextOptions<MovieDbContext> options)
            : base(options)
        {
        }
        public DbSet<MovieEntity> Movie { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<MovieEntity>().ToTable("Movie");
        }
    }
}

注意:在OnModelCreating中,将实体和数据表进行映射。

注入EntityFrameworkCore框架

在Program.cs中,注入框架,并将appSetting.json配置的数据库连接字符串传递进去,如下所示:

using DemoCoreMVC;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder();
//注入数据库框架
builder.Services.AddDbContext<MovieDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();

 

创建控制器MovieController

在项目中,创建MovieController,在Index方法中查询电影信息,并将数据传递给视图,如下所示:

using DemoCoreMVC.Models;
using Microsoft.AspNetCore.Mvc;
namespace DemoCoreMVC.Controllers
{
    public class MovieController : Controller
    {
        private MovieDbContext movieDb;
        public MovieController(MovieDbContext movieDb)
        {
            this.movieDb = movieDb;
        }
        public IActionResult Index()
        {
            //1.获取数据库实体
            var entities = movieDb.Movie.Skip(0).Take(20).ToList();
            //2.将实体转换成业务模型
            var movies = entities.Select(e => new Movie()
            {
                Id = e.Id,
                Name = e.Name,
                Genre = e.Genre,
                LeadingRole = e.LeadingRole,
                Price = e.Price,
                ReleaseDate = e.ReleaseDate,
            }).ToList();
            ViewData.Add("Movies",movies);
            return View();
        }
    }
}

创建视图Index.cshtml

视图用于显示电影列表,代码如下所示:

@{
    ViewData["Title"] = "Index";
    var movies = ViewData["Movies"] as List<Movie>;
}
<h1>Index</h1>
<table class="table">
    <thead>
        <tr>
            <td>序号</td>
            <td>电影名称</td>
            <td>类型</td>
            <td>主演</td>
            <td>上映时间</td>
            <td>票价</td>
            <td>功能</td>
        </tr>
    </thead>
@for (var i = 0; i < movies.Count; i++)
    {
        var movie = movies[i];
        <tr>
        <td>@movie.Id</td>
        <td>@movie.Name</td>
        <td>@movie.Genre</td>
        <td>@movie.LeadingRole</td>
        <td>@movie.ReleaseDate</td>
        <td>@movie.Price</td>
        <td><a href="/Movie/Edit/@movie.Id">编辑</a> | <a href="/Movie/Delete/@movie.Id">删除</a></td>
    </tr>
}
</table>

运行测试

经过上述步骤,程序已经搭建完成,运行程序并输入URL:https://localhost:7152/Movie,打开效果如下所示:

参考文章

本文主要参考文章如下:

数据库故障排查:https://learn.microsoft.com/zh-cn/troubleshoot/sql/welcome-sql-server

ASP.NET Core MVC入门之数据库:https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/first-mvc-app/working-with-sql?view=aspnetcore-7.0&tabs=visual-studio

以上就是ASP.NET Core MVC从入门到精通之数据库的全部内容,旨在抛砖引玉,一起学习,共同进步。

相关文章
|
21天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
39 5
|
29天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
27 3
|
6天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
25 0
|
10天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
38 3
|
10天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
38 3
|
10天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
52 2
|
24天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
168 15
|
17天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
24天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
29天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。