【问题标题】:How to create two navigation properties to one model (EF6 Code First)如何为一个模型创建两个导航属性(EF6 代码优先)
【发布时间】:2013-11-16 16:02:35
【问题描述】:

使用 EF6 Code First 约定,我想创建具有同一个表的两个外键的模型。例如,现在我有 Team 模型:

public class Team
{
    public Guid Id { get; set; }
    public String Name { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}

匹配模型:

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    public virtual Team TeamHome { get; set; }
    public virtual Team TeamAway { get; set; }
}

但在项目运行后,我遇到了下一个异常:

在表“Matches”上引入 FOREIGN KEY 约束“FK_dbo.Matches_dbo.Teams_TeamHomeId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 无法创建约束。

有什么建议吗?

【问题讨论】:

    标签: c# .net code-first entity-framework-6


    【解决方案1】:

    试试这个,如果你使用迁移。迁移并非每次都聪明,有时您应该重新编写代码。

    public class Match
    {
        public Guid Id { get; set; }
        public Int32 TeamHomeScore { get; set; }
        public Int32 TeamAwayScore { get; set; }
    
        public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
        public Guid TeamAwayId { get; set; } //
    
        [ForeginKey("TeamHomeId")]
        public virtual Team TeamHome { get; set; }
        [ForeginKey("TeamAwayId")]
        public virtual Team TeamAway { get; set; }
    }
    

    然后您将在 DataContex.cs 中添加以下内容

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
    modelBuilder.Entity<Match>()
                   .HasRequired(a => a.TeamHome )
                   .WithMany()
                   .HasForeignKey(u => u.TeamHomeId);
    
    modelBuilder.Entity<Match>()
                   .HasRequired(a => a.TeamAway )
                   .WithMany()
                   .HasForeignKey(u => u.TeamAwayId);
    }
    

    【讨论】:

      【解决方案2】:

      SQL Server 返回错误,因为它无法处理多个级联路径。多重路径是具有许多 Team 属性的 Match

      将删除时的级联设置为 false。

          protected override void OnModelCreating(DbModelBuilder modelBuilder)
          {
              modelBuilder.Entity<Match>()
                          .HasRequired<Team>(i => i.TeamHome)
                          .WithMany(i => i.Matches)
                          .WillCascadeOnDelete(false);
      
              base.OnModelCreating(modelBuilder);
          }
      

      由于没有级联删除,所以必须先删除球队的比赛,然后再删除球队本身。

      【讨论】:

        猜你喜欢
        • 2017-12-07
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 2014-12-15
        • 1970-01-01
        相关资源
        最近更新 更多