2014-12-04 3 views
0

У меня возникают проблемы с настройкой отношений в сущностной структуре 6 и выполнением каскадной операции удаления.Каскадное удаление в структуре сущности

У меня есть следующие объекты

public class Module { 
    public long Id { get; set; }; 
    public virtual ICollection<Group> Groups { get; set; }; 
} 

public class Group { 
    public long Id { get; set; }; 
    public virtual ICollection<Field> Fields { get; set; }; 
} 

public class Field { 
    public long Id { get; set; }; 
    public virtual FieldLink Link { get; set; }; 
} 

public class FieldLink { 
    public long Id { get; set; }; 
    public virtual Module LinkToModule { get; set; }; 
} 

Теперь модуль имеет группы, группа имеет поле, поле может иметь ссылку. Ссылка будет иметь LinkToModule, но это может быть другой модуль, кроме того, который принадлежит родительскому полю/группе.

У меня есть настройки мои отношения как так

public ModuleConfig() 
{ 
    this.ToTable("Module"); 
} 

public FieldGroupConfig() 
{ 
    this.ToTable("FieldGroup"); 

    // relationships 
    this.HasRequired(e => e.Module) 
     .WithMany(e => e.Groups) 
     .HasForeignKey(e => e.ModuleId); 
} 

public FieldConfig() 
{ 
    this.ToTable("Field"); 

    this.HasRequired(e => e.FieldGroup) 
     .WithMany(e => e.Fields) 
     .HasForeignKey(e => e.FieldGroupId); 


    this.HasOptional(e => e.Link) 
     .WithRequired(e => e.Field); 

} 

public FieldLinkConfig() 
{ 
    this.ToTable("FieldLink"); 

    this.HasRequired(e => e.LinkToModule) 
     .WithMany() 
     .HasForeignKey(e => e.LinkToModuleId); 
} 

Теперь я бегу моих тестов, и я получаю следующую ошибку

Test method ModuleServiceTests.ModuleService_DeleteAsync_ByEntity threw exception: 

System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.FieldLink_dbo.Field_Id". The conflict occurred in database "TestDb", table "dbo.FieldLink", column 'Id'. 

Ибо если я проверить отношения, то между таблицами Field .Id> FieldLink.Id и правило DELETE установлено как NO ACTION. Хорошо, так что я думаю, что мне нужно обновить эти отношения и использовать WillCascadeOnDelete (истинный)

Так я обновил код в FieldConfig от

this.HasOptional(e => e.Link) 
    .WithRequired(e => e.Field); 

в

this.HasOptional(e => e.Link) 
    .WithRequired(e => e.Field) 
    .WillCascadeOnDelete(true); 

Но теперь, когда я пытаюсь запустить мой тест, база данных даже не создана, и я получаю сообщение об ошибке

Initialization method Test.TestInitialize threw exception. 
System.Data.SqlClient.SqlException: Introducing FOREIGN KEY constraint 'FK_dbo.FieldLink_dbo.Field_Id' on table 'FieldLink' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

Может кто-нибудь Помогите? Я неправильно настроил отношения, не так ли?

ответ

0

MS SQL Server не поддерживает циклы в каскаде, удаляет действия. Вам нужно выбрать только одно из двух направлений для удаления каскадов или найти обходной путь, как в этом answer (пример триггера: here в Listing 6). Этот answer также содержит некоторые идеи.

+0

Так что, если кто-то удалит модуль, мне придется вручную закодировать все поля FieldLinks, указывающие на этот модуль, удалить сначала, а затем удалить модуль и позволить sql каскад остальным? – Gillardo

+0

Вы можете выбрать только одно направление для каскадного удаления или решить его вручную (с помощью триггера «INSTEAD OF» в коде и т. Д.). Я добавил некоторые ссылки на ответ. – alik

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