2016-08-11 158 views
1

我试图关系添加到网页API项目中使用EF代码第一次我的实体实体框架代码优先 - 关系

我的数据库种子码是

internal class ProductDbInitializer : DropCreateDatabaseAlways<ProductDbContext> 
{ 
    protected override void Seed(ProductDbContext context) 
    { 
     Category category = new Category(); 
     LanguagesDbContext languagesDbContext = new LanguagesDbContext(); 
     List<Language> languages = new List<Language> 
     { 
      new Language {Name="English",Code="en" }, 
      new Language {Name="Italian", Code="it" }, 
      new Language {Name="Russian",Code="rus" }, 
     }; 

     languagesDbContext.Languages.AddRange(languages); 

     context.Categories.Add(category); 

     List<CategoryText> categoryText = new List<CategoryText>(); 

     foreach (var language in languages) 
     { 
      string name = string.Empty; 

      switch (language.Code) 
      { 
       case "en": 
        name = "paper"; 
        break; 
       case "it": 
        name = "carta"; 
        break; 
       case "rus": 
        name = "бумага"; 
        break; 
       default: 
        name = "paper"; 
        break; 
      } 

      categoryText.Add(new CategoryText 
      { 
       Category = category, 
       Language = language, 
       Name = name 
      }); 
     } 

     category.CategoryTexts.Add(categoryText[1]); 
     context.CategoryTexts.AddRange(categoryText); 

     context.SaveChanges(); 
    } 
} 

一切都存储在数据库,我想在我的课的申报问题,因为当我想Categories我没有能够看到CategoryTexts

这是浏览器输出

output in browser

但在数据库中,我的CategoryTexts已添加有效的CategoryId

这是我的类别和CategoryText实体

public class Category 
{ 
    public Category() 
    { 
     CategoryTexts = new List<CategoryText>(); 
    } 

    public int Id { get; set; } 
    public ICollection<Product> Products { get; set; } 
    public ICollection<CategoryText> CategoryTexts { get; set; } 
} 

public class CategoryText 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 
    public int LanguageId { get; set; } 

    [ForeignKey("CategoryId")] 
    public Category Category { get; set; } 

    [ForeignKey("LanguageId")] 
    public Language Language { get; set; } 
    public string Name { get; set; } 
} 

请帮助我理解我在哪里需要更改代码

回答

2

你需要或者渴望负荷你的人际关系(当您查询时使用Include),例如:

var myList = context.Products.Include("Categories").Include("CategoryTexts").ToList(); 

或者你可以明确地加载它们(与context.Entry(x).[Reference|Collection](x).Load(),例如:

var myProduct = context.Products.First(); 
context.Entry(myProduct).Collection(x => x.Categories).Load(); 

或者:

var myCategoryText = context.CategoryText.First(); 
context.Entry(myCategoryText).Reference(x => x.Language).Load(); 

或者你可以让他们使用代理的自动负载(延迟加载)...但为此,您的外国实体和收藏必须在您的POCO中标记为virtual

public class Category 
{ 
    public Category() 
    { 
     CategoryTexts = new List<CategoryText>(); 
    } 

    public int Id { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<CategoryText> CategoryTexts { get; set; } 
} 

public class CategoryText 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 
    public int LanguageId { get; set; } 

    [ForeignKey("CategoryId")] 
    public virtual Category Category { get; set; } 

    [ForeignKey("LanguageId")] 
    public virtual Language Language { get; set; } 
    public string Name { get; set; } 
} 

你还需要有代理的创建和延迟加载开启,但这是在EF6默认。

还记得那方面必须是“活的”(未配置)accesing属性时,这样有一个活的情况下,他们可以被加载

链接到相关的文档:https://msdn.microsoft.com/en-us/data/jj574232.aspx

+0

所以如果我标记作为虚拟它会自动添加? –

+0

是的,如果你有延迟加载和代理生成,并且在访问引用时上下文仍然可用(不处理),它会加载它 – Jcl

+0

非常感谢你的信息,你是英雄 –

相关问题