我有一个包含多个字段的表,这些字段是另一个表中主键的外键.例如 :
Fixture Id (PK)
HomeTeamId (FK to Team.TeamId)
AwayTeamId (FK to Team.TeamId)
HomeTeamCoachId (FK to Coach.CoachId)
AwayTeamCoachId (FK to Coach.CoachId)
Run Code Online (Sandbox Code Playgroud)
将这些数据分成两个表HomeTeam和AwayTeam以及FixtureId的外键会更好吗?这是当前由实体框架生成的内容:
FixtureId PK
HomeTeamId int
AwayTeamId int
HomeTeamCoachId int
AwayTeamCoachId int
AwayTeam_TeamId FK
HomeTeam_TeamId FK
AwayTeamCoach_CoachId FK
HomeTeamCoach_CoachId FK
Run Code Online (Sandbox Code Playgroud)
这是通过这个类生成的:
public partial class Fixture
{
public int FixtureId { get; set; }
//foreign key
public int AwayTeamId { get; set; }
//navigation properties
public virtual Team AwayTeam { get; set; }
//foreign key
public int HomeTeamId { get; set; }
//navigation properties
public virtual Team HomeTeam { get; set; }
//foreign key
public int AwayCoachId { get; set; }
//navigation properties
public virtual Coach AwayCoach { get; set; }
//foreign key
public int HomeCoachId { get; set; }
//navigation properties
public virtual Coach HomeCoach { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我这是否是正确的方法吗?
编辑:回复Slauma
所以我的课程基本上会是这样的?或者OnModelCreating中的配置是否意味着我不需要我的Fixture类中的一些外键相关代码?
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Entity Type Configuration
modelBuilder.Configurations.Add(new TeamConfiguration());
modelBuilder.Configurations.Add(new CoachConfiguration());
modelBuilder.Configurations.Add(new FixtureConfiguration());
modelBuilder.Entity<Fixture>()
.HasRequired(f => f.AwayTeam)
.WithMany()
.HasForeignKey(f => f.AwayTeamId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Fixture>()
.HasRequired(f => f.HomeTeam)
.WithMany()
.HasForeignKey(f => f.HomeTeamId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Fixture>()
.HasRequired(f => f.AwayCoach)
.WithMany()
.HasForeignKey(f => f.AwayCoachId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Fixture>()
.HasRequired(f => f.HomeCoach)
.WithMany()
.HasForeignKey(f => f.HomeCoachId)
.WillCascadeOnDelete(false);
}
public partial class Fixture
{
public int FixtureId { get; set; }
public string Season { get; set; }
public byte Week { get; set; }
//foreign key
public int AwayTeamId { get; set; }
//navigation properties
public virtual Team AwayTeam { get; set; }
//foreign key
public int HomeTeamId { get; set; }
//navigation properties
public virtual Team HomeTeam { get; set; }
//foreign key
public int AwayCoachId { get; set; }
//navigation properties
public virtual Coach AwayCoach { get; set; }
//foreign key
public int HomeCoachId { get; set; }
//navigation properties
public virtual Coach HomeCoach { get; set; }
public byte AwayTeamScore { get; set; }
public byte HomeTeamScore { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Sla*_*uma 10
显然,EF不会检测您的int属性,如AwayTeamId导航属性的外键,AwayTeam因为主键属性Team不是,Id但是TeamId.如果它们被命名为AwayTeamTeamId或者如果主键属性Team具有名称,它可能会检测到FK Id.
如果您不想根据EF约定更改这些属性名称,则可以使用数据注释定义FK:
[ForeignKey("AwayTeam")]
public int AwayTeamId { get; set; }
public virtual Team AwayTeam { get; set; }
// the same for the other three FKs
Run Code Online (Sandbox Code Playgroud)
或者流利的API:
modelBuilder.Entity<Fixture>()
.HasRequired(f => f.AwayTeam)
.WithMany()
.HasForeignKey(f => f.AwayTeamId)
.WillCascadeOnDelete(false);
// the same for the other three FKs
Run Code Online (Sandbox Code Playgroud)
我已禁用级联删除,因为默认情况下它将启用所需的关系.但是因为你有两个必需的关系到Team表(以及Coach表),它将导致两个级联删除路径Fixture到Team和Coach.多级联删除路径被禁止在SQL Server中,所以你必须禁用级联删除了两者之间的关系中的至少一个Fixture与Team(之间Fixture和Coach).