How do I set up my domain and the LINQ statement so I can delete a record from a database?
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; }
}
What I’d like to do is delete Category and be able to cascade the delete to all the child products.
- Is there any other additional attributes needed in my domain?
- What is the LINQ statement to delete objects without doing a round trip? (I do not want to select, just a direct delete).
Is this the only way to do this?
Category category = new Category() { CategoryId = 1 } ;
context.AttachTo("Category", category);
context.DeleteObject(category);
context.Savechanges();
You mentioned EF code first which means EF 4.1 but you have shown example of deleting object in EF 4. Correct approach to delete object in EF 4.1 without loading it from database is:
If you didn’t change anything in configuration of defalut conventions it will also delete all related products because
OneToManyCascadeDeleteConventionsensures that all one-to-many relations are created withON CASCADE DELETE. There will be no additional roundtrips to database – only singleDELETEstatement forCategorywithId= 1.The different situation can occure if you want to delete fully loaded
Category(with loadedProductsnavigation property) in such case EF will create separate delete statement for eachProductso you will have N+1 roundtrips to database where N is number of products in category. Here is how cascade delete works in EF. It is related to entity designer but described principles are the same.