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

我想能够得到这个特殊Post的最新Blog,按Post.CreatedDate排序。我可以看到,如果要重写所述方法,我可以在Dbcontext.OnModelCreating()中映射我想要的东西。我只是不太确定如何做这个映射。我是否可以这样做,并获取最新的Post

最佳答案

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

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; }
}

然后在Posts方法中,您可以将其映射为:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .HasOptional(m => m.LatestPost)
        .WithMany()
        .HasForeignKey(m => m.LatestPostId);
}

但我建议您在需要时加载OnModelCreating
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中的LatestPost
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Ignore(m => m.LatestPost);
}

此外,可以通过添加OnModelCreating属性忽略此属性:
public class Blog
{
    ....

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

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

10-14 16:34
查看更多