2013-05-31 120 views
0

我想弄清楚,如何实现导航属性到我的实体......但是我的导航性能总是空:EF CodeFirst - 添加ICollection的导航属性

我已经设置了两个实体:

实体1包含此行:

public int Id { get; set; } 
    public ICollection<BestellterArtikel> BestellteArtikel { get; set; } 

我的第二个实体看起来是这样的:

public int Id { get; set; } 
    public int BestellungId { get; set; } 
    public Bestellung BestellteArtikel { get; set; } 

进一步包括我此行我的覆盖OnModelCreating法:

modelBuilder.Entity<Bestellung>().HasMany(e => e.BestellteArtikel).WithRequired(e => e.Bestellung); 

我做了什么错?我忘记了一些重要的事情吗?它是否必须如此复杂?我必须在每个属性的覆盖方法中添加一行吗?

回答

1

这里是我的解决方案:

实体1:

public virtual ICollection<BestellterArtikel> BestellteArtikel { get; set; } 

实体2:

public virtual Bestellung BestellteArtikel { get; set; } 

编辑:

你也必须修改您的映射:

modelBuilder.Entity<Bestellung>().HasMany(e => e.BestellteArtikel).WithRequired(e => e.BestellteArtikel); 

而不是参考BestellteArtikel财产,你提到的类型!

+0

叫什么名字?如果您的意思是“虚拟”,那么它就是一个C#关键字,并且在EF模型中使用它意味着延迟加载引用。 –

+0

等一下!你的映射有问题。我编辑了我的答案 –

+0

不,您还没有正确理解我的意思:我有一个名为BestellterArtikel的实体(照顾R!)与财产“Bestellung”和一个实体Bestellung与ICollection“BestellteArtikel”(没有R!)。 。我不能重命名这些属性,就像你在代码中做的那样...;) – Jannik

1

你是什么意思的“始终为空”?
如果您在尝试从数据库中读取空值,
请记住,当您查询上下文时,需要加载导航属性, 或使用EF延迟加载。

阅读this了解更多信息。

+0

当我用Find(1)请求我的第一个实体时(我在请求之前在DB中创建了一些示例实体)并将鼠标移动到导航上财产“BestellteArtikel”,其无效,我不能扩大它(无论是懒惰还是热切加载),尽管我有2-3个应该在那里的实体。 – Jannik

+0

var bestellung = db。AlleBestellungen.FirstOrDefault(p => p.Id == 1);这就是我试图做的(使用虚拟关键字) – Jannik

+0

所以,请阅读我的链接并添加'.Include(“”)到您的查询 – Liel