假设一个数据库有两个表: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; }
}
我想能够得到这个特殊
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/