Den*_*lez 5 asp.net-mvc entity-framework entity-framework-core
嗨我有同样的问题,这里的旧帖子,解决方案提供在我的MVC 6与EF7不起作用是简单的
public class Match
{
[Key]
public int MatchId { get; set; }
public DateTime playday { get; set; }
public float HomePoints { get; set; }
public float GuestPoints { get; set; }
public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }
[ForeignKey("HomeTeamId")]
[InverseProperty("HomeMatches")]
public virtual Team HomeTeam { get; set; }
[ForeignKey("GuestTeamId")]
[InverseProperty("AwayMatches")]
public virtual Team GuestTeam { get; set; }
}
public class Team
{
public int TeamId { get; set; }
public String name { get; set; }
public virtual ICollection<Match> HomeMatches { get; set; }
public virtual ICollection<Match> AwayMatches { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我找到的最好的方法,因为我可以添加一个新的迁移,一切都没问题,但是当我更新数据库时,我得到一个像这样的错误
在表'匹配'上引入FOREIGN KEY约束'FK_Match_Team_HomeTeamId'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.无法创建约束或索引.查看以前的错误.
我在准备答案的过程中详细分析了这个问题,我可以建议你解决这个问题的两种解决方案。
问题的存在是由于类中的两个属性Match
public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }
Run Code Online (Sandbox Code Playgroud)
以及将生成的外键HomeTeamId和。GuestTeamIdEF7 生成的外键为ON DELETE CASCADE,不能作为一个外键用于多个用途。实体框架 (RC1) 的当前实现没有注释属性,您可以使用它来更改行为。
问题的第一个解决方案是使用可空属性,例如
public int? HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }
Run Code Online (Sandbox Code Playgroud)
或者
public int HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }
Run Code Online (Sandbox Code Playgroud)
最多有一个属性不能为 null。结果,问题将得到解决,但会有一些小缺点,这对于某些场景来说可能并不重要。NOT NULL数据库表中可空属性的字段在列定义中将没有属性。
如果您确实需要同时保留HomeTeamId和不可为空,那么您可以通过修改使用GuestTeamId类Match和 的上下文类(继承自 DbContext)来解决问题。Team
您已经在下面定义了一些上下文类
public class MyDBContext : DbContext
{
DbSet<Team> Teams { get; set; }
DbSet<Match> Matches { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
为了解决描述问题,您可以OnModelCreating在显式设置的类中添加 protected
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; }
}
Run Code Online (Sandbox Code Playgroud)
您可以在两个外键上使用 Cause DeleteBehavior.Restrict(而不是DeleteBehavior.Cascade在一个外键上使用 of)。值得注意的是,最后一种方法允许将HomeTeamId和保留GuestTeamId为不可为空,就像数据库中的相应字段一样。
请参阅文档以获取更多信息。
| 归档时间: |
|
| 查看次数: |
2345 次 |
| 最近记录: |