Ответ 1
Я бы подумал, что это происходит потому, что:
DownloadCategory : Category : Article
против
Download : Article
Ключ находится в классе Article. Несколько DownloadCategories
могут использовать один и тот же Category
, поэтому он не будет каскадом при удалении, так как это может привести к повреждению других DownloadCategory
.
Возможно, это ошибка в Entity Framework, так как вы используете TPC, это должно быть выведено. Посмотрите эту статью для обходных путей.
В частности, эти разделы:
В большинстве случаев Entity Framework может вывести, какой тип зависимый и который является основным в отношениях. Однако, когда оба конца связи необходимы или обе стороны являются необязательными инфраструктура Entity Framework не может идентифицировать зависимую и основную. когда оба конца отношения необходимы, используйте
WithRequiredPrincipal
илиWithRequiredDependent
после методаHasRequired
. Когда оба конца отношения являются необязательными, используйтеWithOptionalPrincipal
илиWithOptionalDependent
после методаHasOptional
.
// Configure the primary key for the OfficeAssignment
modelBuilder.Entity<OfficeAssignment>()
.HasKey(t => t.InstructorID);
modelBuilder.Entity<Instructor>()
.HasRequired(t => t.OfficeAssignment)
.WithRequiredPrincipal(t => t.Instructor);
Вы можете настроить каскадное удаление в отношениях, используя
WillCascadeOnDelete
. Если внешний ключ на зависимом объекте не является нулевым, то Code First устанавливает каскадное удаление на отношения. Если внешний ключ на зависимом объекте является нулевым, Код First не устанавливает каскадное удаление в отношении, и когда главный удаляется, внешний ключ будет установлен наnull
.Вы можете удалить эти соглашения об исключении каскадов, используя:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()
Следующий код настраивает требуемое соотношение, а затем отключает каскадное удаление.
modelBuilder.Entity<Course>()
.HasRequired(t => t.Department)
.WithMany(t => t.Courses)
.HasForeignKey(d => d.DepartmentID)
.WillCascadeOnDelete(false);