我有一个使用实体框架的Web API。我有几个表使用代码首次设置创建。我的比赛课程定义如下。
一切都很好,我能够获取我的Competitions
表数据以及返回集合的导航属性中的所有数据。但是,我无法获取CompetitionTypes
和Users
导航属性的任何值。 OwnerId
引用UserId
表中的Users
。
如何在CompetitionTypes
和Users
表格中获取关联数据?我基本上想要与三个集合导航属性相同的东西,除了CompetitionTypes
和Users
只会返回一行。
public partial class Competitions
{
[Key, Required]
public int CompetitionId { get; set; }
public int CompetitionTypeId { get; set; }
public int OwnerId { get; set; }
public string CompetitionName { get; set; }
public CompetitionTypes CompetitionTypeId { get; set; }
public Users UserId { get; set; }
public ICollection<Participants> Participants { get; set; }
public ICollection<ResultStats> ResultStats { get; set; }
public ICollection<Results> Results { get; set; }
}
}
答案 0 :(得分:0)
EF根据约定自动匹配FK属性和导航属性。也就是说,它期望FK属性的命名与导航属性相同,最后只有Id
。换句话说,要让它自动匹配OwnerId
,您需要一个导航属性,如:
public User Owner { get; set; }
由于您的导航属性为UserId
,因此它实际上正在寻找名为UserIdId
的属性。
如果您不想遵循惯例,那么您必须使用ForeignKey
属性或fluent配置告诉EF哪个属性属于哪个。
那就是说,你在这里命名的东西有一些非常重要的问题。首先,实体应该始终是单数User
,而不是Users
。其次,您不应该拥有以Id
结尾的导航属性:例如,User
,而不是UserId
。只有实际的PK或FK属性应以Id
结尾。最后,不要在实体上使用实体名称作为前缀属性的前缀。最后一个主要是为了便于阅读。哪个更自然:competition.Id
或competition.CompetitionId
?与CompetitionName
同样;它应该只是Name
。而且,对于它的价值,对于主键或非可空类型(例如Required
),您不需要int
。在任何一种情况下,默认情况下都需要该属性。