gpt4 book ai didi

c# - Entity Framework - 数据库映射以获取最新条目

转载 作者:行者123 更新时间:2023-11-29 04:36:38 24 4
gpt4 key购买 nike

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

我希望能够获取此特定 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com