У меня возникают проблемы с настройкой отношений в сущностной структуре 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.
Может кто-нибудь Помогите? Я неправильно настроил отношения, не так ли?
Так что, если кто-то удалит модуль, мне придется вручную закодировать все поля FieldLinks, указывающие на этот модуль, удалить сначала, а затем удалить модуль и позволить sql каскад остальным? – Gillardo
Вы можете выбрать только одно направление для каскадного удаления или решить его вручную (с помощью триггера «INSTEAD OF» в коде и т. Д.). Я добавил некоторые ссылки на ответ. – alik