实体框架核心代码第一模型导航属性

时间:2018-03-25 01:47:40

标签: asp.net-core ef-core-2.0

我有一个使用实体框架的Web API。我有几个表使用代码首次设置创建。我的比赛课程定义如下。

一切都很好,我能够获取我的Competitions表数据以及返回集合的导航属性中的所有数据。但是,我无法获取CompetitionTypesUsers导航属性的任何值。 OwnerId引用UserId表中的Users

如何在CompetitionTypesUsers表格中获取关联数据?我基本上想要与三个集合导航属性相同的东西,除了CompetitionTypesUsers只会返回一行。

    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; }
    }
}

1 个答案:

答案 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.Idcompetition.CompetitionId?与CompetitionName同样;它应该只是Name。而且,对于它的价值,对于主键或非可空类型(例如Required),您不需要int。在任何一种情况下,默认情况下都需要该属性。