Код структуры объекта сначала удаляется каскадом - PullRequest
26 голосов
/ 02 апреля 2011

Как мне настроить свой домен и оператор 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; }
}

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

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

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

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

Ответы [ 2 ]

41 голосов
/ 02 апреля 2011

Сначала вы упомянули код 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();

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

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

3 голосов
/ 23 марта 2012

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

Category category = db.Categories.Find(id);
db.Categories.Remove(category);
db.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...