用于跟踪EF Core

时间:2017-06-18 16:36:34

标签: c# asp.net-mvc entity-framework model-view-controller asp.net-core

作为学习新东西的一种方式,我决定尝试创建一个网站来跟踪C#.Net Core MVC中的赛车结果,并使用EF代码第一个数据库。

然而,直接走出大门,我想知道我对我的数据结构采取了错误的方法。

我有Nation和Season的模特,这是直接前进(身份证,姓名和季节赛事的集合)。然而,我完成Race和Driver模型的方式有点复杂。我想跟踪a)比赛的位置,b)它是哪个赛季的一部分,c)哪个车手在哪里完成。

每场比赛将有26名车手竞争。

这是我为比赛创建的模型:

    public class Race
    {
        public int ID { get; set; }
        public int SeasonID { get; set; }
        public Season Season { get; set; }
        public int NationID { get; set; }
        public Nation Nation { get; set; }

        public int Driver1ID { get; set; }
        [ForeignKey("Driver1ID")]
        public virtual Driver Driver1 { get; set; }

        public int Driver2ID { get; set; }
        [ForeignKey("Driver2ID")]
        public virtual Driver Driver2 { get; set; }

        public int Driver3ID { get; set; }
        [ForeignKey("Driver3ID")]
        public virtual Driver Driver3 { get; set; }

        // And so on, I'll spare you the rest, it goes all the way down to 26...

        public int Driver26ID { get; set; }
        [ForeignKey("Driver26ID")]
        public virtual Driver Driver26 { get; set; }


    }

这是Driver的模型:

public class Driver
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int NationID { get; set; }
        public Nation Nation { get; set; }
        public ICollection<Race> P1 { get; set; }
        public ICollection<Race> P2 { get; set; }
        public ICollection<Race> P3 { get; set; }
// Again I'll save you the whole thing, it goes down to 26...
        public ICollection<Race> P26 { get; set; }
    }

为了完成这项工作,我想我必须在Context类中设置关系,就像这样......

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Race>().HasOne(r => r.Driver1).WithMany(d => d.P1);
            modelBuilder.Entity<Race>().HasOne(r => r.Driver2).WithMany(d => d.P2);
            modelBuilder.Entity<Race>().HasOne(r => r.Driver3).WithMany(d => d.P3);
// Snip down to 26 again...
            modelBuilder.Entity<Race>().HasOne(r => r.Driver26).WithMany(d => d.P26);
        }

但是当我尝试更新数据库时,我得到一个错误,这个结构会导致“循环或多个级联路径”,这听起来确实不太好。我知道可以将Cascade Delete设置为关闭,但是错误信息让我觉得我首先在这里错误的路径......我在这里完全咆哮错误的树吗?

非常感谢任何帮助或建议!

1 个答案:

答案 0 :(得分:2)

我想我会模仿这样的东西(省略季节,国家等):

public class Race
{
    public int ID { get; set; }

    public virtual ICollection<RaceParticipation> Participants { get; set; }
 }

public class Driver
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<RaceParticipation> Races { get; set; }
}

public class RaceParticipation
{
    public int ID {get;set;}
    public Race Race {get;set;}
    public Driver Driver {get;set;}
    // maybe information like this:
    public int StartingPosition {get;set;}
    public int FinalPosition {get;set;}
}

事实上,每个种族都有26个参与者,IMO应该是您业务逻辑的一部分,而不是数据库设计。这可能是将来某些时候可能会发生变化的事情(即,当您希望每场比赛有不同数量的参与者时)。因此,在代码中使用该逻辑似乎更灵活。