Почему у меня не сохраняются данные в БД?
У меня есть две сущности категория и подкатегория. Они имеют отношение один ко многим.
public class Category : BaseEntity
{
private readonly ICollection<Subcategory> _subcategories = new List<Subcategory>();
private Category()
{
}
public Category(string name)
{
SetName(name);
}
public string Name { get; private set; }
public IEnumerable<Subcategory> Subcategories => _subcategories.AsEnumerable();
public void SetSubcategories(IEnumerable<Subcategory> subcategories)
{
foreach (Subcategory subcategory in subcategories)
{
if (subcategory != null)
{
_subcategories.Add(subcategory);
}
}
}
protected internal void SetName(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentNullException(nameof(name));
Name = name;
}
}
public class Subcategory : BaseValueObjectsWithId
{
private Subcategory()
{
}
public Subcategory(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentNullException(nameof(name));
Name = name;
}
public string Name { get; init; }
}
Я создаю сущность категории добавляя сразу подкатегории
Category category = new(request.Name);
if (request.Subcategories != null)
{
category.SetSubcategories(new []{new Subcategory(request.Subcategories.First().Name)});
}
await _categoryService.CreateCategoryAsync(category, cancellationToken);
return new CreateCategoryResponse(category.Id);
И получается так, что в методе репозитория я вижу, что у меня сущность такая какая должна быть, но в бд добавляется только категория, а её подкатегории нет
public Task<int> CreateAsync(T objectWithId, CancellationToken cancellationToken = default)
{
_dataContext.Entry(objectWithId).State = EntityState.Added;
_dataContext.Set<T>().Add(objectWithId);
return _dataContext.SaveChangesAsync(cancellationToken);
}
Ответы (1 шт):
_dataContext.Entry(objectWithId).State = EntityState.Added; - эта строка лишняя.
Смотрим документацию Accessing Tracked Entities. Раздел Working with the entity. Цитата:
Unlike in EF6, setting the state of an individual entity will not cause all connected entities to be tracked. This makes setting the state this way a lower-level operation than calling Add, Attach, or Update, which operate on an entire graph of entities.
То есть, когда вы вручную изменяете State, не происходит отслеживание всех подкатегорий. Если оставить только вызов метода Add, это произойдёт автоматически.