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


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

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

Я начал со следующего: walkthough , и изменение кода для выполнения удаления.

Это код:

 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 3

1 ответ:

Связь между продуктом и категорией была сконфигурирована как необязательная из-за того, что свойство внешнего ключа класса продукта (т. е. Product.CategoryId) имеет тип nullable (т. е. 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; }
}