实体框架导航问题

时间:2015-07-30 18:10:48

标签: entity-framework

我将BusinessBusinessProgram声明为:

 public class Business : DbIdEntity
    {
        public string Name { get; set; }
        public virtual Address PhysicalAddress { get; set; }
        public virtual Address PostalAddress { get; set; }

        public Guid OwnerKey { get; set; }
        public virtual Account Owner { get; set; }
        public virtual IEnumerable<BusinessProgram> BusinessPrograms { get; set;                   }

    }

public class BusinessProgram : DbEntity<Guid>
{
    public Business Business { get; set; }
    public ProgramType ProgramType { get; set; }

    public DateTime? EffectiveDate { get; set; }
    public DateTime? ExpireDate { get; set; }
}

DbIdEntityDbEntity只是主键(以及声明自动编号Id字段的基类。

当我使用此查询查询时

foreach (Data.Business business in context.Businesses.Include(b => b.Owner)
                                                     .Include(b => b.PhysicalAddress)
                                                     .Include(b => b.Owner)
                                                     .Include(b => b.BusinessPrograms)
                                                     .OrderBy(b => b.Name))

我还使用一种约定,使以“Key”结尾的属性成为主键和外键,而不是默认的“Id”。

我收到错误:

  

“指定的包含路径无效.EntityType   'Data.Business'未声明导航   名为'BusinessPrograms'的财产。“

我做错了什么?

更新 我使用IEnumerable代替ICollection。使用正确的导航属性类型修复了问题。

2 个答案:

答案 0 :(得分:1)

我使用IEnumerable作为导航类型而不是ICollection。将其更改为ICollection可解决此问题。

答案 1 :(得分:0)

我以你描述的方式使用基类的成功相当有限。我首先尝试“展平”你的模型,让它像那样工作。然后你可以尝试重新引入基类; 可能能够使其工作。

如果您想使用默认约定,那么看起来好像BusinessProgram应包含名为BusinessProgram_BusinessId的FK属性。或者,您可以为其指定一个不同的名称,并使用属性覆盖默认约定:

[ForeignKey("Business")]
public int BusinessId { get; set;}