对象模型和关系数据库中的关系表示形式,包括 EF Core 在两者之间的映射方式
public class Post
{//文章
public string Title { get; set; }
public string Content { get; set; }
public DateOnly PublishedOn { get; set; }
public bool Archived { get; set; }
public Blog Blog { get; set; }//属于那个博客
public int BlogId { get; set; }
}
public class Blog {//博客 public string Name { get; set; } public virtual Uri SiteUri { get; set; } public ICollection<Post> Posts { get; }//包含多遍文章 }
注意:单一关系通常可以按任一方向遍历。 在此示例中,即通过 Blog.Posts
属性从 Blog
到 Post
,以及通过 Post.Blog
属性从 Post
返回到 Blog
。 这是一个关系,不是两个。
提示:在 EF Core 中,Blog.Posts
和 Post.Blog
属性称为“导航”。
关系数据库使用外键表示关系:
CREATE TABLE [Posts] ( [Id] int NOT NULL IDENTITY, [Title] nvarchar(max) NULL, [Content] nvarchar(max) NULL, [PublishedOn] datetime2 NOT NULL, [Archived] bit NOT NULL, [BlogId] int NOT NULL, CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]), CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE); CREATE TABLE [Blogs] ( [Id] int NOT NULL IDENTITY, [Name] nvarchar(max) NULL, [SiteUri] nvarchar(max) NULL, CONSTRAINT [PK_Blogs] PRIMARY KEY ([Id]));
在生成类似这样的简单关系时,EF 会自动执行此操作,但在重写你的 DbContext
的 OnModelCreating
方法时也可以显式指定。 例如:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .HasMany(e => e.Posts) .WithOne(e => e.Blog) .HasForeignKey(e => e.BlogId) .HasPrincipalKey(e => e.Id); }