2016-09-30 107 views
1

想象一下具有两个表的数据库: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; } 
} 

我希望能够得到最新的Post这个特殊Blog,通过Post.CreatedDate排序。如果我要覆盖所述方法,我可以看到我可以按照我想要的方式映射Dbcontext.OnModelCreating()中的内容。我只是不太确定如何做这个映射。我可以这样做,并得到Blog的最新Post

回答

4

要做到这一点,你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(); 
     } 
    } 
} 

不要忘记忽略LatestPostOnModelCreating

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Blog>() 
     .Ignore(m => m.LatestPost); 
} 

此外,您可以通过添加忽略此属性NotMapped属性:

public class Blog 
{ 
    .... 

    [NotMapped] 
    public virtual Post LatestPost 
    ..... 
} 
+1

好回答。我虽然只是在需要的时候加载它,但由于某种原因,我的头说这是不好的做法......谢谢你的答案。 – Detilium

+0

@Detilium,我很高兴它有帮助 –