2012-07-10 68 views
1

我有一个导航属性未加载的问题。我对所有其他实体都有同样的设置,但是这是使用一个不是自然FK(数字)并且不会级联的属性,它将由触发器处理。实体框架代码首先不拉动导航属性

Expression<Func<DivisionBracketGameParticipant, object>>[] includes2 = { 
                         q => q.DivisionWinnerBracketGame, 
                         q => q.DivisionLoserBracketGame 
                        }; 
      var test = _divisionBracketGameParticipantsRepository.GetMany(includes2, 
                     q => 
                     q.DivisionBracketGame.DivisionBracket.Division. 
                      EventId == eventId); 

数据库模式

DivisionBracketGame 

Id 
Number 

DivisionBracketGameParticipant 

Id 
DivisionBracketGameId -> Id 
DivisionBracketGameWinnerNumber -> Number 
DivisionBracketGameLoserNumber -> Number 

实体

[Table("DivisionBracketGame", Schema = "GrassrootsHoops")] 
    public class DivisionBracketGame : BaseEntity 
    { 
     public int Id{ get; set; } 
     public int Number { get; set; } 

     [InverseProperty("DivisionBracketGame")] 
     public virtual ICollection<DivisionBracketGameParticipant> DivisionBracketGameParticipants { get; set; } 

     [InverseProperty("DivisionWinnerBracketGame")] 
     public virtual ICollection<DivisionBracketGameParticipant> DivisionWinnerBracketGameParticipants { get; set; } 

     [InverseProperty("DivisionLoserBracketGame")] 
     public virtual ICollection<DivisionBracketGameParticipant> DivisionLoserBracketGameParticipants { get; set; } 
    } 

[Table("DivisionBracketGameParticipant", Schema = "GrassrootsHoops")] 
public class DivisionBracketGameParticipant : BaseEntity 
    { 
     public int Id{ get; set; } 
     public virtual int DivisionBracketGameId { get; set; } 
     public virtual int? DivisionWinnerBracketGameNumber { get; set; } 
     public virtual int? DivisionLoserBracketGameNumber { get; set; } 

     [ForeignKey("DivisionBracketGameId")] 
     public virtual DivisionBracketGame DivisionBracketGame { get; set; } 

     [ForeignKey("DivisionWinnerBracketGameNumber")] 
     public virtual DivisionBracketGame DivisionWinnerBracketGame { get; set; } 

     [ForeignKey("DivisionLoserBracketGameNumber")] 
     public virtual DivisionBracketGame DivisionLoserBracketGame { get; set; } 
    } 

回答

0

,因为它不是一个主键EF不会产生关系Number。主键是你的DivisionBracketGameId,所以DivisionWinnerBracketGameDivisionLoserBracketGame的目标都是Id(而不是Number)。

一对多关系要求主表中的列是唯一的 - 在您的情况下,列应该是Number。这可以通过使用主表中的主键或通过在该列上使用唯一索引在数据库中实现。 EF不支持唯一索引/候选键,因此在EF中构建一对多关系的唯一方法是通过主体表的主键。

FK值用于获取相关值,因此目前它可能会查找具有错误值的记录,因为它使用了错误的列。

+0

即使我明确告诉它外键是什么? – 2012-07-10 15:37:30

+0

你可以告诉EF哪些属性是导航属性的外键,但是你不能告诉EF该关系没有根据主表中的主键定义。 – 2012-07-10 15:42:17

+0

拉迪斯拉夫,我可以从你的语句推断导航属性将生成**只** **外键指向主键,而不是唯一键?我问这[这里](http://stackoverflow.com/questions/32327153/are-navigation-properties-generated-only-for-fks-on-pks-as-opposed-to-unique-ke)。 – Veverke 2015-09-01 08:48:41