加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC6中的实体框架7多个外键到同一个表

发布时间:2020-12-16 06:55:08 所属栏目:asp.Net 来源:网络整理
导读:嗨我有同样的问题,这里的旧帖子,解决方案提供在我的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 { ge
嗨我有同样的问题,这里的旧帖子,解决方案提供在我的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; }
}

这是我找到的最好的方法,因为我可以添加一个新的迁移,一切都没问题,但是当我更新数据库时,我得到一个像这样的错误

Introducing FOREIGN KEY constraint ‘FK_Match_Team_HomeTeamId’ on table ‘Match’ may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION,or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

解决方法

我在准备 the answer时详细分析了这个问题,我可以建议你解决这个问题.

由于Match类中的两个属性存在问题

public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }

以及将生成的外键HomeTeamId和GuestTeamId. EF7使用ON DELETE CASCADE生成外键,不能将其用作一个外键.实体框架(RC1)的当前实现没有注释属性,您可以使用它来更改行为.

该问题的第一个解决方案是使用可空的属性,如

public int? HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }

要么

public int HomeTeamId { get; set; }
public int? GuestTeamId { get; set; }

最多一个属性应该是不可为空的.结果问题将得到解决,但是会有一个小缺点,这对某些情况可能并不重要. nullable属性的数据库表中的字段在列定义中没有NOT NULL属性.

如果确实需要同时保持HomeTeamId和GuestTeamId不可为空,那么您可以通过修改上下文类(继承自DbContext)来解决问题,其中使用Match和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和GuestTeamId(如数据库中的相应字段)保持为不可为空.

有关其他信息,请参见the documentation.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读