悠悠楠杉
网站页面
正文:
如果你厌倦了手动编写SQL语句,EF Core的Code First模式会像魔术师一样,将C#类变成数据库表。今天我们就用一杯咖啡的时间,从零开始掌握这项魔法。
Code First的核心是用C#类定义数据结构。比如我们要建一个博客系统,先定义Post和Comment类:
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<Comment> Comments { get; set; } = new();
}
public class Comment
{
public int Id { get; set; }
public string Text { get; set; }
public int PostId { get; set; }
public Post Post { get; set; }
}注意List<Comment>和Post的导航属性——它们定义了表之间的一对多关系。
DbContext是操作数据库的入口,继承自Microsoft.EntityFrameworkCore.DbContext:
public class BlogContext : DbContext
{
public DbSet<Post> Posts { get; set; }
public DbSet<Comment> Comments { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("Server=.;Database=MyBlog;Trusted_Connection=True;");
}这里用了SQL Server连接字符串,如果你想用MySQL,只需替换为UseMySql()。
bash
dotnet tool install --global dotnet-efbash
dotnet ef migrations add InitialCreatebash
dotnet ef database update执行后你会看到数据库里自动生成了Posts和Comments表,连外键都帮你配好了!
插入数据:
using var db = new BlogContext();
var post = new Post { Title = "EF Core指南", Content = "..." };
db.Posts.Add(post);
db.SaveChanges(); // 数据真正入库查询数据:
var hotPosts = db.Posts
.Where(p => p.Title.Contains("指南"))
.Include(p => p.Comments) // 加载关联评论
.ToList();删除数据:
var post = db.Posts.Find(1);
db.Posts.Remove(post);
db.SaveChanges();如果想自定义字段约束,可以用数据注解:
public class Post
{
[Key] // 显式声明主键
public int Id { get; set; }
[Required, MaxLength(100)] // 非空且长度限制
public string Title { get; set; }
}或者用更灵活的Fluent API(在DbContext中配置):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.Property(p => p.Title)
.IsRequired()
.HasMaxLength(100);
}Include时关联数据为null,需显式加载;AddRange替代循环Add;dotnet ef database update PreviousMigrationName。现在,你已经掌握了EF Core Code First的完整工作流。接下来,试着用这个魔法构建你的项目吧!