2013-10-15 2 views
29

Я получаю эту ошибкуВводя ограничение внешнего ключа может вызвать циклы или несколько путей каскадных

Вводя FOREIGN KEY ограничения «FK_dbo.Regions_dbo.Countries_CountryId» на стол «Регионы» может привести к циклов или несколько путей каскадных , Указать 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; } 

    } 

Не может быть из-за магазинов?

+0

Может ли вы показать нам таблицу, связанную, каковы их структура, а самое главное: как Между ними установлены ограничения FK? Итак, вы хотели создать каскадное удаление между регионами и странами, чтобы, если страна удалена, все ее регионы удалены? Звучит разумно - вопрос в том, почему это вызывает цикл?Какие еще ограничения FK с каскадным удалением у вас уже есть? –

+0

Хорошо, я обновил его, чтобы показать эти области, у меня еще нет таблиц, поскольку я делаю код первым. – chobo2

+0

К сожалению, вы не показываете нам класс 'Store' .... и я не вижу никакого кода, который определяет каскадные удаления, либо ... –

ответ

54

Все отношения в вашей модели требуется, потому что все иностранные ключевые свойства (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 (и обратные ссылки и свойства FK) со всех объектов, кроме City. Для меня эти коллекции выглядят излишними, потому что вы можете найти все магазины в Country, перейдя по коллекциям Regions.Cities.Stores.

+0

Итак, магазины будут иметь отношения только с городом? – chobo2

+0

@ chobo2: Да, я думаю, этого было бы достаточно. – Slauma

+12

+1 информативный; Argh, это ограничение на стороне SQL Server вызывает раздражение. Во многих и многих ситуациях у вас есть таблица, которая реализует отношения «много-ко-многим» между двумя таблицами, и вы хотите иметь неэлементные внешние ключи в обе эти таблицы в таблице отношений и удалять из любой из эти таблицы каскадируются в таблицу отношений. Поэтому я думаю, что мы оставили очень неидеальное решение оставить один из внешних ключей нулевым. Либо это, либо выполнение пользовательских триггеров каждый раз. Какая лаваш. – Shavais

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

+18

Это не решение, а решение этой проблемы. – Sebazzz

+4

Это точное решение, когда вы не имеете никакого контроля над дизайном схемы. – Askolein

+0

so · lu · tion səlo͞oSH (ə) n/ существительное 1. средство решения проблемы или решения сложной ситуации. –

Смежные вопросы