Каскадное удаление в EF4 CTP5 Code First выполняет обновление дочерних записей

Используя описанный здесь метод, я пытаюсь удалить родительскую запись и все связанные дочерние записи. Однако, что происходит, родительский объект удаляется, как и ожидалось, но поле ключа дочерней записи обновляется до NULL, а не удаляется.

Я также установил правило удаления внешнего ключа дочерней таблицы на Cascade, а удаление из родительской таблицы в SQL Server Management выполняет каскадное удаление, как и ожидалось.

Я начал с того, что следовал этой инструкции, и изменил код, чтобы выполнить удаление.

это код:

 using (var db = new ProductContext())
 {
     var food = db.Categories.Find("FOOD");
     ((IObjectContextAdapter)db).ObjectContext.LoadProperty(food, f => f.Products);

     db.Categories.Remove(food);
    int recordsAffected = db.SaveChanges();

Я что-то упускаю? Или ребенок-сирота записывает ожидаемый результат?

1 ответ

Решение

Связь между Product и Category была настроена как необязательная в связи с тем, что свойство внешнего ключа в классе Product (т.е. Product.CategoryId) имеет обнуляемый тип (т.е. string). Чтобы сделать эту связь обязательной, чтобы дочерняя сущность была удалена в результате удаления родителя, вы должны отметить CategoryId как Required как я сделал в следующем коде:

public class Category
{
    public string CategoryId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }

    [Required]
    public string CategoryId { get; set; }
    public virtual Category Category { get; set; }
}
Другие вопросы по тегам