HttpContext
在ASP.NET Core中,HttpContext 是用于访问有关当前 HTTP 请求的信息的重要组件。它包含有关请求的上下文信息,例如请求头、请求体、响应等。
你在上述代码中使用了 HttpContext 来获取用户的会话信息。
使用HttpContext来获取当前用户的登录信息,目前的使用主要是获取用户的ID:
例如:int? userId = HttpContext.Session.GetInt32("UserId");
这里使用了 HttpContext.Session 来访问会话信息。在这个例子中,它试图从会话中获取键为 "UserId" 的值,并将其赋值给 userId 变量。
if (HttpContext.Session.Keys.Contains("UserId"))
{
// 获取 UserId 的逻辑
}
HttpContext.Session.Keys 检查是否存在 "UserId" 键
使用HttpContext一般需要在Startup.cs或者Program.cs中添加一下代码
services.AddSession();//在Program.cs中为Build.services.AddSession()
app.UseSession();
在MVC中使用EF目前先是在Models中创建一个上下文程序文件,文件中的类继承DbContext(一般在项目中加入EF的包就可以,本项目中使用的是Microsoft.EntityFrameworkCore),使用DbSet把各个
表添加进来,然后初始化 DbContext 的实例,具体代码如下:
//DbContext 是 Entity Framework 中的核心类,负责管理应用程序与数据库之间的连接、映射实体对象到数据库表、跟踪实体对象的状态变化等任务
public class DataContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Menu> Menus { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<RoleMenu> RoleMenus { get; set; }
/// <summary>
/// 学生
/// </summary>
public DbSet<Student> Students { get; set; }
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
//在这个构造函数中,DbContextOptions<DataContext> 参数是一个包含有关数据库连接和配置的选项对象。通过传递这个选项对象,你可以配置 DbContext 与特定数据库的连接和行为。
//这个构造函数的作用有以下几点:
//1、过构造函数的参数 options,你可以传递包含数据库连接字符串、数据库提供程序(例如,MySQL、SQL Server 等)以及其他配置信息的选项。
//2、初始化基类: base(options) 调用了 DbContext 的基类构造函数,将传递进来的选项用于初始化基类。这是确保 DbContext 具有正确配置以与数据库通信的关键步骤。
}
还应该对其进行配置,一般在Startup.cs或者Program.cs进行配置,表明使用的是什么数据库以及连接字符串,一般连接字符串会放在配置文件中,不同数据库连接字符串也稍有不同
具体代码及配置如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
//数据库EntityFrameworkCore注入
services.AddDbContext<DataContext>(option =>
option.UseMySql(Configuration.GetConnectionString("Default"),
new MySqlServerVersion(new Version(7, 0, 0))));
services.AddHttpContextAccessor();
services.AddSession();//配置session访问服务
}
配置文件连接字符串配置如下:
"ConnectionStrings": {
"Default": "Server=localhost;Database=CS;User=root;Password=123456"
},
目前的问题是,我想在MVC中使用EF框架把Models中所建立的模型,使之在MySql中自动生成表不需要自己在建立一遍,之前在控制台应用中实现了基于Code First模式的创建,但在MVC还没有实现
经过产找资料已经实现在MySql中自动生成表,所遇到的问题是我使用 Add-Migration InitialCreate命令时,无法将“Add-Migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称,解决
办法是在项目中安装一个工具包(Microsoft.EntityFrameworkCore.Tools),就可以识别该命令,完成自动生成的功能。
我是新建的MVC项目,首先就安装了三个包分别为(Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Tools、Pomelo.EntityFrameworkCore.MySql),通过这三个包就可以基本实现
通过模型自动生成数据库中的表,这个过程中数据库名称可以是已有的也可使新建的(直接在连接字符串中的database中修改),之后控制台中执行命令就可以实现该功能。
具体过程如下
1.在Models中添加一个模型如Product
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
2.创建一个继承DbContext的类如ApppDbContext
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySql("Server=localhost;Database=CS1;User=root;Password=123456", new MySqlServerVersion(new Version(8, 0, 22)));
}
}
3.执行命令
Add-Migration InitialCreate
Update-Database
以上过程虽然能够所需的功能(在MySql数据库中自动生成模型的表,所生成的表都会在模型名后加s),但在我要实际运行的时候有报错(比如查询的时候)
因此,通常的做法是把连接字符串放在配置文件中,在Models中上下文文件中进行初始化,在program中创建该服务,具体代码如下:
public AppDbContext(DbContextOptions<AppDbContext> option) : base(option)
{
}
builder.Services.AddDbContext<AppDbContext>(option =>
option.UseMySql(builder.Configuration.GetConnectionString("Default"),
new MySqlServerVersion(new Version(7, 0, 0))));