作为学习新东西的一种方式,我决定尝试创建一个网站来跟踪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设置为关闭,但是错误信息让我觉得我首先在这里错误的路径......我在这里完全咆哮错误的树吗?
非常感谢任何帮助或建议!
答案 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应该是您业务逻辑的一部分,而不是数据库设计。这可能是将来某些时候可能会发生变化的事情(即,当您希望每场比赛有不同数量的参与者时)。因此,在代码中使用该逻辑似乎更灵活。