学海无涯

导航

对象模型和关系数据库中的关系表示形式,包括 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);
}

  

 

posted on 2023-09-20 15:23  宁静致远.  阅读(13)  评论(0编辑  收藏  举报