2016-09-30 108 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,我很高興它有幫助 –