EF Core(Entity Framework Core)是微软为.Net Core(现在叫.Net)开发的一款数据库ORM框架,其特点是通用性高和扩展性强,可以自行开发对应的数据库驱动。裸的EF Core自然是不好用的,所以我们需要安装一些扩展来提升它的实用性。
包可以从NuGet中下载安装,以MySQL的对接为例,我们需要:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
Pomelo.EntityFrameworkCore.MySql
其中,EF Core是必须的;EF Core Tools用于数据库迁移(Migration),例如通过Code First生成或修改表结构,不需要也可以不装;最后MySQL驱动可以根据自己需求改为其他数据库的驱动;由于Pomelo.EntityFrameworkCore.MySql依赖了Microsoft.EntityFrameworkCore.Relational所以上面没提,这个Relational是用作实体关系配置的,一般也会需要用到。
装完以后就是如何配置的问题了,其实也很简单,首先我们创建一个模型(实体),对应一个数据表,命名空间自己定:
namespace Project.Models
{
public class User
{
public long Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public string? NickName { get; set; } = null;
public DateTime CreateTime { get; set; }
public List<Difficulty> DiffList { get; set; }
}
}
然后创建一个DbContext,用于与数据库进行CURD操作:
namespace Project.Data
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(
DbContextOptions options) : base(options)
{
}
public DbSet<User> Users { get; set; }
}
}
最后,在Program.cs(顶级程序)中添加如下代码:
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContextPool<ApplicationDbContext>(options =>
options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)));
注意,这并不是一个固定的格式,且如果你没有使用顶级程序的模式,则需要转换成另一种格式编写。但是,总的而言,它是这样工作的。
另外还需注意的是,许多教程会教我们使用AddDbContext来添加DbContext,实际上这是不被推荐的。如果你的应用程序为服务器(例如Blazor Server或.Net Core MVC),则可能会导致DbContext出现冲突(例如影响缓存)。使用AddDbContextPool有助于我们在不同的生命周期(例如SignalR连接)中创建多个DbContext和数据库连接,并在合适的时间自动回收并重置它,这可以使得DbContext在不同的生命周期中不会互相影响。不过,使用AddDbContextPool可能会导致我们获取的DbContext并不是共享的,这可能导致我们无法在DbContext中使用某些共享的数据,但这很好处理——只要不在里面放共享数据即可,而这也是DbContext本身设计的目的。
待续……