繁体   English   中英

实体框架 - 获取最新条目的数据库映射

[英]Entity Framework - Database mapping to get latest entry

想象一个有两个表的数据库: BlogPost 在我的场景中, Post表有一个名为CreateDate的属性,它等于Post创建日期。 我在BlogPost之间有一个关系,其中一个Blog可以包含许多Posts ,并且我希望有一个名为LatestPost的 C# 模型属性。 下面是一个例子:

public class Blog
{
    public int Id { get; set; }
    public string Title { get; set; }

    public virtual List<Post> Posts { get; set; }
    public virtual Post LatestPost { get; set; }
}

我希望能够获得此特定Blog的最新Post ,按Post.CreatedDate排序。 我可以看到,如果我要覆盖所述方法,我可以在Dbcontext.OnModelCreating()按照我想要的方式映射事物。 我只是不太确定如何进行此映射。 我可以这样做并获取Blog的最新Post吗?

为此,您的Blog应该具有Posts外键,例如:

public class Blog
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int LatestPostId? { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
    public virtual Post LatestPost { get; set; }
}

然后在OnModelCreating方法中,您可以将其映射为:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasOptional(m => m.LatestPost)
        .WithMany()
        .HasForeignKey(m => m.LatestPostId);
}

但我建议您在需要时加载LatestPost

Post latestPost = myContext.Posts
    .Where(m => m.BlogId == blogId)
    .OrderByDescending(m => m.CreatedDate)
    .FirstOrDefault();

此外,您可以不映射LatestPost并将其配置为从数据库加载数据:

public class Blog
{
    public int Id { get; set; }
    public string Title { get; set; }       

    public virtual ICollection<Post> Posts { get; set; }
    public virtual Post LatestPost
    {
        get
        {
            return Posts
                .OrderByDescending(m => m.CreatedDate)
                .FirstOrDefault();
        }
    }
}

不要忘记忽略LatestPost中的OnModelCreating

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Ignore(m => m.LatestPost);
}

此外,您可以通过添加NotMapped属性来忽略此属性:

public class Blog
{
    ....

    [NotMapped]
    public virtual Post LatestPost
    .....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM