假设一个数据库有两个表: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();
}
}
}
不要忘记在 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/