2015-04-28 5 views
0

A Template может иметь ноль или много Document и ноль или много MetaIndex. Document может иметь ноль или более Index и MetaIndex также может иметь ноль или более Index:Как решить несколько каскадных путей с кодом сущности сперва

enter image description here

Это представляет потенциальную проблему каскада, так как удаление Template удалит его Document (что нормально); удаление Document удалит его Index, что тоже нормально. Но при удалении Template попробуйте удалить MetaIndex (который также удалит Index) появится проблема (цикл).

Я понимаю проблему. Я думаю, что способ решить это - указать, что при удалении шаблона удаляются его документы и индексы его документа, а также метаиндексы, связанные с шаблоном. Но что metaindices не каскадируют, удаляют связанные с ним индексы, поэтому циклы не появляются.

Поиск здесь для potential solution, я попытался это:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<MetaIndex>().HasMany<Index>(m => m.IndicesEnteros).WithRequired().WillCascadeOnDelete(false); 
} 

Но это не работает:

Вводя ограничение внешнего ключа на таблицу может вызвать циклов или несколько путей порогами. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение. См. Предыдущие ошибки.

+0

Кажется, что вы пытаетесь установить ограничение при указании WithRequired(), но тогда вы установите для каскада значение false. В событии вы удаляете зависимый элемент db, не обновляете другой элемент, и ограничение будет нарушено. Чтобы решить эту проблему, попробуйте включить каскад. – Gustavo

+0

@GustavoSuarez, каскад именно то, что я пытаюсь удалить. Неважно, если я использую WithOptional() вместо этого, поведение будет таким же. –

ответ

0

И наконец, после reading and re-reading the docs Я смог заставить его работать, но понимая порядок свойств. Я отправляю свое собственное решение, если оно может помочь другим.

Индекс имеет требуемый метаиндекс (поскольку он не имеет значения NULL, если он был, то не было создано каскадное удаление). Далее указывается, как он является судоходным (WithMany, свойство collection в классе MetaIndex - это индексы). Наконец, мне нужно указать имя поля внешнего ключа, которое (по стандартам) MetaIndexID. Тогда я могу указать, что мне не нужно каскадное удаление. Таким образом, единственный способ удалить Index с каскадом - удалить документ (что я хотел).

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<Index>() 
     .HasRequired(index => index.MetaIndex) 
     .WithMany(metaIndex => metaIndex.Indices) 
     .HasForeignKey(index => index.MetaIndexID) 
     .WillCascadeOnDelete(false); 

    base.OnModelCreating(modelBuilder); 
}