c# - Entity Framework - 数据库映射以获取最新条目

标签 c# mysql sql-server entity-framework .net-core

假设一个数据库有两个表: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();
        }
    }
}

不要忘记在 OnModelCreating 中忽略 LatestPost:

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

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

public class Blog
{
    ....

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

关于c# - Entity Framework - 数据库映射以获取最新条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785365/

相关文章:

c# - 最佳实践 : efficient sprite drawing in XNA

c# - SQL Azure 数据库的本地 SQL 更改

php - 仅限管理员访问网页

SQL Server DENSE_RANK()

c# - 在登录 View 中找到控件

c# - 调试 Matlab 中使用的 DLL

php - 尝试修复从 MYSQL 收到的错误时遇到问题

PHP MYSQL 连接两个表并回显数据

sql-server - 使用 PROBE 代替索引查找进行索引扫描

sql-server - 我的 PIVOT 返回重复行,每行中包含数据透视列值