0

当我尝试使用 CodeFirst 创建我的数据库时,出现错误

在表 'Location' 上引入 FOREIGN KEY 约束 'FK_dbo.Location_dbo.Section_SectionID' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

看着这两张表,我不明白为什么会弹出这个错误,谁能告诉我我错过了什么?

节表:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FFInfo.DAL
{
    [Table("Section")]
    public class Section
    {
        [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int16 ID { get; set; }

        public Int64? LogoFileID {get;set;}

        [Required, MaxLength(250), Column(TypeName = "varchar")]
        public string RouteName { get; set; }

        [Required, MaxLength(15), Column(TypeName = "varchar")]
        public string Type { get; set; }

        [ForeignKey("LogoFileID")]
        public virtual File Logo { get; set; }

        public virtual ICollection<SectionTranslation> Translations { get; set; }
    }
}

位置表:

    using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FFInfo.DAL
{
    [Table("Location")]
    public class Location
    {
        [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [Required]
        public Int16 SectionID { get; set; }

        [Required]
        public byte LocationTypeID { get; set; }

        public Int64? MapID { get; set; }

        [ForeignKey("SectionID")]
        public virtual Section Section { get; set; }

        [ForeignKey("LocationTypeID")]
        public virtual LocationType LocationType { get; set; }
    }
}

位置翻译:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FFInfo.DAL
{
    [Table("LocationTypeTranslation")]
    public class LocationTypeTranslation
    {
        [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [Required]
        public byte TypeID { get; set; }

        [Required]
        public byte CultureCodeID { get; set; }

        [Required]
        public string Name { get; set; }

        [ForeignKey("TypeID")]
        public virtual LocationType Type { get; set; }

        [ForeignKey("CultureCodeID")]
        public virtual CultureCode CultureCode { get; set; }
    }
}

部分翻译:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FFInfo.DAL
{
    [Table("SectionTranslation")]
    public class SectionTranslation
    {
        [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        [Required]
        public Int16 SectionID { get; set; }

        [Required]
        public byte CultureCodeID { get; set; }

        [Required]
        public string Title { get; set; }

        public string Synopsis { get; set; }

        [ForeignKey("SectionID")]
        public Section Section { get; set; }

        [ForeignKey("CultureCodeID")]
        public virtual CultureCode CultureCode { get; set; }
    }
}

文化代码:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FFInfo.DAL
{
    [Table("CultureCode")]
    public class CultureCode
    {
        [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public byte ID { get; set; }

        [Required, MaxLength(5), Column(TypeName = "char")]
        public string Code { get; set; }

        [Required, MaxLength(50), Column(TypeName = "varchar")]
        public string LanguageName { get; set; }

        [Required, MaxLength(50)]
        public string DisplayName { get; set; }
    }
}
4

1 回答 1

0

我试图在您的模型中找到多个级联删除路径,但我找不到。根据您问题中的片段和评论中的附加说明,类图看起来如下所示。线条/箭头的含义如下:

  • 每一行都是与数据库中的 FK 约束的关系。箭头指向从主体到从属关系的方向。
  • 实线:必需的关系(= FK 不可为空)。同时(根据 EF 映射约定)这意味着这样一个实心箭头表示箭头方向的级联删除(除非您使用 Fluent API 覆盖了级联删除,我假设您没有)
  • 虚线:可选关系(= FK 可以为空)。同时(根据 EF 映射约定),这意味着这种虚线箭头与级联删除无关(除非您使用 Fluent API 覆盖了此默认值,我假设您没有)

多级联路径

例外基本上意味着:存在一个实体 X 和一个实体 Y,使得沿着从 X 到 Y 的实线箭头的路径不止一条,而从Sectionto的箭头Location是其中一条路径的一部分。(例外仅指此箭头,因为“引入此 FOREIGN KEY 约束”显然关闭了从某个 X 到某个 Y 的第二条路径。)

我在上图中找不到这样的 X 和 Y(这可能意味着该图不完整,即有更多相关的实体/关系,或者我忽略了某些东西)。我也看不到周期。

您当然可以尝试通过禁用级联删除来打破异常所指的实线:

modelBuilder.Entity<Location>()
    .HasRequired(l => l.Section)
    .WithMany()
    .HasForeignKey(l => l.SectionID)
    .WillCascadeOnDelete(false);

(替代方案:使Location.SectionID类型为空Int16?。)

从业务角度来看,这可能不是最佳选择,但为了有任何其他选择,有必要找到两条相互冲突的路径。

于 2013-10-04T21:52:07.030 回答