2015-09-14 12 views
3

I'm, используя пример, приведенную ниже, от http://ef.readthedocs.org/en/latest/getting-started/aspnet5.html, чтобы проверить asp.net 5 и EF7:Entity Framework 7 отношений

using Microsoft.Data.Entity; 
using System.Collections.Generic; 

namespace EFGetStarted.AspNet5.Models 
{ 
    public class BloggingContext : DbContext 
    { 
     public DbSet<Blog> Blogs { get; set; } 
     public DbSet<Post> Posts { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      // Make Blog.Url required 
      modelBuilder.Entity<Blog>() 
       .Property(b => b.Url) 
       .Required(); 
     } 
    } 

    public class Blog 
    { 
     public int BlogId { get; set; } 
     public string Url { get; set; } 

     public List<Post> Posts { get; set; } 
    } 

    public class Post 
    { 
     public int PostId { get; set; } 
     public string Title { get; set; } 
     public string Content { get; set; } 

     public int BlogId { get; set; } 
     public Blog Blog { get; set; } 
    } 
} 

Но в моем тесте

public List<Post> Posts { get; set; } 

всегда нуль , Этот взгляд должен быть очевидным, потому что он не является экземпляром.

Что я должен сделать, чтобы получить поведение как

myBlog.Posts 

и получить все сообщения этого блога?

+0

[MSDN: Entity Framework Загрузка связанных сущностей] (https://msdn.microsoft.com/en-us/data/jj574232.aspx). – CodeCaster

+2

Вопрос, связанный как ответ, не имеет значения, поскольку речь идет о Entity Framework 7 и связанном вопросе для предыдущей версии. – user3285954

ответ

4

Для свойств навигации необходимо указать ключевое слово virtual. Это связано с тем, что EF создает объекты-прокси (например, наследники ваших классов) для реализации ленивой загрузки. Эти Наследники могут переопределить ваши виртуальные только свойства:

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

В качестве альтернативы вы можете явно перечислить таблицы/классы включают привести множество:

// This statement fills Posts property: 
var blog = dbContext.Blogs.Include(x => x.Posts).FirstOrDefault(x => x.Id == id); 
+0

Отличный ответ для объяснения _why_ он работает, а не просто говоря «сделайте это: ____». – Wiseguy

+0

Название «Посты» следует любому соглашению? Что делать, если мне нужно использовать другое имя (например, OldPosts)? – Beetlejuice

+0

@paulo Вы можете использовать любые имена, которые вам нравятся. EF будет генерировать свойства id для вас. Эти свойства могут иметь такие имена, как * OldPosts_Id * и т. Д. Если вы хотите управлять этими именами, вы можете указать их вручную в таких классах, как ** Blog ** или ** Post **, а затем вы должны изменить свой метод ** OnModelCreating **, чтобы настроить сопоставленные сопоставления сопоставленных/навигационных свойств. –

Смежные вопросы