我在准备的时候详细分析了问题答案我可以建议你解决这个问题的两种方法。
问题的存在是由于类中的两个属性Match
public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }
和外键HomeTeamId
and GuestTeamId
将生成。 EF7 生成外键ON DELETE CASCADE
,它不能用作一个外键。实体框架 (RC1) 的当前实现没有注释属性,您可以使用它来更改行为。
问题的第一个解决方案是使用可空属性,例如
public int? HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }
or
public int HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }
最多有一个属性不能为 null。结果,问题将得到解决,但会有一些小缺点,这对于某些场景来说可能并不重要。数据库表中可空属性的字段将没有NOT NULL
列定义中的属性。
如果您确实需要同时持有两者HomeTeamId
and GuestTeamId
non-nullable 那么你可以通过修改上下文类(继承自DbContext)来解决问题,其中类Match
and Team
使用。
您已经在下面定义了一些上下文类
public class MyDBContext : DbContext
{
DbSet<Team> Teams { get; set; }
DbSet<Match> Matches { get; set; }
}
要解决描述问题,您可以添加受保护的OnModelCreating
在明确设置的类中
public class MyDBContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelbuilder)
{
base.OnModelCreating(modelbuilder);
modelbuilder.Entity(typeof (Match))
.HasOne(typeof (Team), "GuestTeam")
.WithMany()
.HasForeignKey("GuestTeamId")
.OnDelete(DeleteBehavior.Restrict); // no ON DELETE
modelbuilder.Entity(typeof (Match))
.HasOne(typeof (Team), "HomeTeam")
.WithMany()
.HasForeignKey("GuestTeamId")
.OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE
}
DbSet<Team> Teams { get; set; }
DbSet<Match> Matches { get; set; }
}
您可以使用原因DeleteBehavior.Restrict
在两个外键上(而不是使用DeleteBehavior.Cascade
在一个)。重要的是要注意最后一种方法允许同时持有HomeTeamId
and GuestTeamId
,就像数据库中的相应字段一样,不可为空。
See 文档获取更多信息。