33

我收到此错误

在表“Regions”上引入 FOREIGN KEY 约束“FK_dbo.Regions_dbo.Countries_CountryId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 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; }

    }

会不会是商店的原因?

4

2 回答 2

57

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

Country并且Region有多个删除路径到Store表,例如,如果你删除一个Country相关Store的 s 可以通过三个不同的级联路径删除(SQL Server 不允许这样做):

  • Country->Store
  • Country-> Region->Store
  • Country-> Region-> City->Store

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

或者Stores从除City. 对我来说,这些集合看起来是多余的,因为您可以Country通过浏览Regions.Cities.Stores集合找到 a 中的所有商店。

于 2013-10-15T20:04:01.597 回答
25

添加文件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

于 2014-01-04T00:31:28.357 回答