Подтвердить что ты не робот

Код структуры Entity сначала удаляется с помощью каскада

Как настроить мой домен и оператор LINQ, чтобы я мог удалить запись из базы данных?

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

    public List<Product> Products{ get; set; }

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

    public int CategoryId {get; set; }
    public Category Category{ get; set; }
}

Что бы я хотел сделать, это удалить категорию и убрать каскад удаления во все дочерние продукты.

  • Есть ли в моем домене другие дополнительные атрибуты?
  • Что такое оператор LINQ для удаления объектов, не совершая туда и обратно? (Я не хочу выбирать, просто прямое удаление).

Это единственный способ сделать это?

Category category = new Category() {  CategoryId = 1   } ; 
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
4b9b3361

Ответ 1

Сначала вы указали код EF, что означает EF 4.1, но вы показали пример удаления объекта в EF 4. Правильный подход к удалению объекта в EF 4.1 без его загрузки из базы данных:

var category = new Category() { CategoryId = 1 };
context.Categories.Attach(category);
context.Categories.Remove(category);
context.SaveChanges();

Если вы ничего не изменили при настройке соглашений об defalut, оно также удалит все связанные продукты, потому что OneToManyCascadeDeleteConventions гарантирует, что все отношения "один ко многим" создаются с помощью ON CASCADE DELETE. Не будет никаких дополнительных обращений к базе данных - только один оператор DELETE для Category с Id= 1.

В случае, если вы хотите полностью загрузить загруженный Category (с загруженным атрибутом Products), в противном случае EF создаст отдельную инструкцию delete для каждого Product, чтобы вы имели N + 1 roundtrips до где N - количество продуктов в категории. Здесь описано, как каскадное удаление работает в EF. Это связано с дизайнером объекта, но описанные принципы одинаковы.

Ответ 2

Взято из автоматического сгенерированного кода VS2010:

Category category = db.Categories.Find(id);
db.Categories.Remove(category);
db.SaveChanges();