2013-10-15 36 views
29

我收到此错误引进国外KEY约束可能会导致循环或多个级联路径

表“区域”可能会导致 循环或多个级联路径引进国外KEY约束 “FK_dbo.Regions_dbo.Countries_CountryId” 。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。无法 创建约束。查看以前的错误。

我想知道这是不是意味着我的数据库设计是坏?我读您关闭级联或类似的东西,但我只是不知道这是席卷问题出来了地毯的。

我只是让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; } 

    } 

难道是因为商店?

+0

,你能否告诉我们涉及到的表,其结构是什么,最重要的是:如何FK约束在它们之间建立?所以你想在区域和国家之间建立一个级联删除,这样如果一个国家被删除,它的所有区域都会被删除?听起来很合理 - 问题是:为什么会造成循环?你已经有了什么其他的FK级联删除约束? –

+0

好的,我更新它来显示这些区域,我没有任何生成的表,因为我正在做代码第一。 – chobo2

+0

不幸的是,您没有向我们展示'Store'类....并且我没有看到任何定义级联删除的代码,或者... –

回答

54

模型中的所有关系需要因为所有的外键的属性(CountryIdRegionIdCityId)是不可为空。对于需要一个一对多的关系EF将使级联按约定删除。

CountryRegion有多个删除路径的Store表,例如,如果你删除一个Country相关Store S可通过三种不同的层叠路径(这是不允许使用SQL Server)中删除:

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

你必须避免这种暧昧删除路径由要么禁用级联删除使用流利的API或通过定义某些关系作为可选(用空的外键Guid?)。

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

+0

所以商店只会与城市有关系? – chobo2

+0

@ chobo2:是的,我认为这就足够了。 – Slauma

+12

+1内容丰富;呃,这个SQL Server部分的限制令人讨厌。在许多情况下,您都有一个表在两个表之间实现多对多关系,并且您希望在关系表中的这两个表中都有不可空的外键,并且可以删除任何一个这些表级联到关系表。所以我想我们留下了一个非理想的解决方案,让其中一个外键可以为空。要么是每次都要实施自定义触发器。什么皮塔饼。 – Shavais

24

OnModelCreating方法添加modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()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

+18

这不是一个解决方案,即解决这个问题。 – Sebazzz

+4

当您对模式设计没有任何控制权时,这是确切的解决方案。 – Askolein

+0

so·lu·tion səlo͞oSH(ə)n/ noun 1.一种解决问题或处理困难情况的方法。 –

相关问题