[英]Entity Framework - Database mapping to get latest entry
想象一个有两个表的数据库: Blog
和Post
。 在我的场景中, Post
表有一个名为CreateDate
的属性,它等于Post
创建日期。 我在Blog
和Post
之间有一个关系,其中一个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.