EFCore中配置的套路
HasXXX(…).WithXXX(…);
XXX有One与Many两个选项,
HasOne(…).WithMany(…);一对多
HasOne(…).WithOne(…);一对一
HasMany(…).WithMany(…);多对多
例:HasOne(a).WithMany(b);
可以理解为,这个实体有一个a,这个a有多个b。
一对多的关系配置
文章(Article)和评论(Comment)
一个文章可以有多个评论,一个评论只有一个文章。
实体类
class Article
{
public long Id { get; set; }
public string Title { get; set; }
public string Message { get; set; }
public List<Comment> comments { get; set; } = new List<Comment>(); //建议给个空的List
}
class Comment
{
public long Id { get; set; }
public string Message { get; set; }
public Article TheArticle { get; set; }
public long TheArticleId { get; set; }
}
实体类的配置
class ArticleConfig : IEntityTypeConfiguration<Article>
{
public void Configure(EntityTypeBuilder<Article> builder)
{
builder.ToTable("T_Articles");
builder.Property(a => a.Title).HasMaxLength(100).IsUnicode().IsRequired();
builder.Property(a => a.Message).IsUnicode().IsRequired();
}
}
class CommentConfig : IEntityTypeConfiguration<Comment>
{
public void Configure(EntityTypeBuilder<Comment> builder)
{
builder.ToTable("T_Comments");
builder.Property(a => a.Message).IsRequired().IsUnicode();
builder.HasOne<Article>(c => c.TheArticle).WithMany(a => a.comments).HasForeignKey(c=>c.TheArticleId).IsRequired();
}
}
MyDbContext
class MyDbContext : DbContext
{
public DbSet<Article> Articles{ get; set; }
public DbSet<Comment> Comments{ get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer("Server=.;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//从当前程序集中加载所有的IEntityTypeConfiguration
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
执行Add-Migration Init命令
再执行Update-database
命令
接着就可以去数据库查看对应的表了