Używam DDD. Mam produkt klasy, który jest zbiorczym katalogiem głównym.Usuń element z kolekcji przy użyciu Entity Framework
public class Product : IAggregateRoot
{
public virtual ICollection<Comment> Comments { get; set; }
public void AddComment(Comment comment)
{
Comments.Add(comment);
}
public void DeleteComment(Comment comment)
{
Comments.Remove(comment);
}
}
Warstwa, która zawiera modele, wcale nie wie o EF. Problem polega na tym, że gdy zadzwonię pod numer DeleteComment(comment)
, EF zgłasza wyjątek
Relacja z zestawu "Product_Comments" AssociationSet znajduje się w stanie "Deleted". Biorąc pod uwagę ograniczenia wielokrotności, odpowiedni "Product_Comments_Target" musi również znajdować się w stanie "Usunięte".
Nawet jeśli element zostanie usunięty z kolekcji, EF go nie usunie. Co powinienem zrobić, aby to naprawić, nie łamiąc DDD? (Mam na myśli podejmowania repozytorium również w komentarzach, ale nie jest w porządku)
przykładowy kod:
Bo próbuję użyć DDD The Product
jest agregatem korzeń, i ma repozytorium IProductRepository
. Komentarz nie może istnieć bez produktu, w związku z tym jest dzieckiem o nazwie Product
Aggregate, a Product
odpowiada za tworzenie i usuwanie komentarzy. Comment
nie ma repozytorium.
public class ProductService
{
public void AddComment(Guid productId, string comment)
{
Product product = _productsRepository.First(p => p.Id == productId);
product.AddComment(new Comment(comment));
}
public void RemoveComment(Guid productId, Guid commentId)
{
Product product = _productsRepository.First(p => p.Id == productId);
Comment comment = product.Comments.First(p => p.Id == commentId);
product.DeleteComment(comment);
// Here i get the error. I am deleting the comment from Product Comments Collection,
// but the comment does not have the 'Deleted' state for Entity Framework to delete it
// However, i can't change the state of the Comment object to 'Deleted' because
// the Domain Layer does not have any references to Entity Framework (and it shouldn't)
_uow.Commit(); // UnitOfWork commit method
}
}
Wygląda na to, że nie wywołujesz SaveChanges EF – Nagg
Domyślam się, że istnieje tabela o nazwie Target. Ta tabela ma odwołanie FK do tabeli komentarzy. Podczas próby usunięcia wiersza w tabeli komentarzy powiązane wiersze w obiekcie docelowym muszą zostać usunięte jako pierwsze. –
@Nagg Otrzymuję ten błąd, gdy wywołuję SubmitChanges() – Catalin