Для приложения, использующего Code First EF 5 beta, я:
public class ParentObject
{
public int Id {get; set;}
public virtual List<ChildObject> ChildObjects {get; set;}
//Other members
}
и
public class ChildObject
{
public int Id {get; set;}
public int ParentObjectId {get; set;}
//Other members
}
Соответствующие операции CRUD выполняются репозиториями, где это необходимо.
В
OnModelCreating(DbModelBuilder modelBuilder)
Я установил их:
modelBuilder.Entity<ParentObject>().HasMany(p => p.ChildObjects)
.WithOptional()
.HasForeignKey(c => c.ParentObjectId)
.WillCascadeOnDelete();
Итак, если a ParentObject
удален, его объекты ChildObject тоже.
Однако, если я запустил:
parentObject.ChildObjects.Clear();
_parentObjectRepository.SaveChanges(); //this repository uses the context
Я получаю исключение:
Операция завершилась неудачно: отношение не может быть изменено, поскольку одно или несколько свойств внешнего ключа не имеют значения NULL. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный с ним объект должен быть удален.
Это имеет смысл, поскольку определение сущностей включает нарушающее ограничение внешнего ключа.
Могу ли я настроить сущность на "очистить себя", когда она становится сиротой, или я должен вручную удалить эти ChildObject
из контекста (в этом случае с помощью ChildObjectRepository).