【问题标题】:Entity Framework - Database mapping to get latest entry实体框架 - 数据库映射以获取最新条目
【发布时间】:2017-02-08 16:02:49
【问题描述】:

想象一个有两个表的数据库:BlogPost。以我的场景为例,Posttable 有一个名为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() 中随意映射事物。我只是不太确定如何进行此映射。我是否可以这样做并获得最新的Post Blog

【问题讨论】:

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


    【解决方案1】:

    为此,您的 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
        .....
    }
    

    【讨论】:

    • 很好的答案。我想在需要的时候加载它,但由于某种原因,我的脑袋告诉我这是不好的做法......谢谢你的回答。
    • @Detilium,我很高兴它有帮助
    猜你喜欢
    • 2011-12-29
    • 2010-10-14
    • 1970-01-01
    • 2018-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多