引入FOREIGN KEY约束可能会导致循环或多个级联路径

时间:2013-10-15 04:28:26

标签: entity-framework cascading

我收到此错误

  

引入FOREIGN KEY约束   表'Regions'上的'FK_dbo.Regions_dbo.Countries_CountryId'可能导致   循环或多个级联路径。指定ON DELETE NO ACTION或ON   更新无操作,或修改其他FOREIGN KEY约束。不能   创建约束。查看以前的错误。

我想知道这是否意味着我的数据库设计不好?我读到你关闭了瀑布或类似的东西,但我不确定这是否将问题彻底解决了。

我只是让EF通过我的域类生成我的表(此时我没有使用任何数据注释或流畅的映射)。

       public class Country
        {
            public Country()
            {
                this.Stores = new List<Store>();
                this.Regions = new List<Region>();
                Id = GuidCombGenerator.GenerateComb();
            }

            public Guid Id { get; private set; }

            private string name;

            public string Name
            {
                get { return name; }
                set
                {
                    name = value.Trim();
                }
            }

            private string code;

            public string Code
            {
                get { return code; }
                set
                {
                    code = value.Trim();
                }
            }

            public virtual ICollection<Store> Stores { get; set; }
            public virtual ICollection<Region> Regions { get; set; }
        }


          public class City
        {
            public City()
            {
                this.Stores = new List<Store>();
                Id = GuidCombGenerator.GenerateComb();
            }

            public Guid Id { get; private set; }

            private string name;

            public string Name
            {
                get { return name; }
                set
                {
                    name = value.Trim();
                }
            }


            public Guid RegionId { get; set; }
            public virtual Region Region { get; set; }

            public virtual ICollection<Store> Stores { get; set; }
        }


            public class Region
        {
            public Region()
            {
                this.Cities = new List<City>();
              this.Stores = new List<Store>();


                Id = GuidCombGenerator.GenerateComb();
            }

            public Guid Id { get; private set; }


            private string state;

            public string State
            {
                get { return state; }
                set
                {
                    state = value.Trim();
                }
            }


            public Guid CountryId { get; set; }
            public virtual ICollection<City> Cities { get; set; }
            public virtual Country Country { get; set; }
           public virtual ICollection<Store> Stores { get; set; }
        }


  public class Store
    {
        public Store()
        {
            Id = GuidCombGenerator.GenerateComb();

            Users = new List<User>();
        }

        public Guid Id { get; private set; }

        public Guid CountryId { get; set; }
        public Guid CityId { get; set; }
        public Guid RegionId { get; set; }
        public virtual City City { get; set; }
        public virtual Country Country { get; set; }
        public virtual Region Region { get; set; }

        public virtual ICollection<User> Users { get; set; }

    }

可能是因为商店吗?

2 个答案:

答案 0 :(得分:54)

模型中的所有关系都是必需,因为所有外键属性(CountryIdRegionIdCityId不可为空。对于所需的一对多关系,EF将按惯例启用级联删除。

CountryRegionStore表的多个删除路径,例如,如果删除Country,则可以通过删除相关的Store三个不同的级联路径(SQL Server不允许):

  • Country - &gt; Store
  • Country - &gt; Region - &gt; Store
  • Country - &gt; Region - &gt; City - &gt; Store

您必须通过使用Fluent API禁用级联删除或将某些关系定义为可选(具有可为空的外键Guid?)来避免此类不明确的删除路径。

或者从除Stores之外的所有实体中删除City集合(以及反向引用和FK属性)。对我来说,这些集合看起来多余,因为您可以通过导航Country集合找到Regions.Cities.Stores中的所有商店。

答案 1 :(得分:24)

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()文件的OnModelCreating方法中添加DataContext,如下所示:

public class YourDataContext : DbContext
{
    public DbSet<Country> Countries{ get; set; }
    ...


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

    }
}

同样的问题:entity-framework-how-to-solve-foreign-key-constraint-may-cause-cycles-or-multi