Ваш код содержит, например, for i, row in df3.iterrows():
петля. Внутри этого цикла row
относится к текущей строке.
Так, например, вместо df3['SKU'][i]
Вы должны использовать row['SKU']
или даже row.SKU
.
Используйте аналогичный подход к другим случаям чтения / записи из столбцов текущей строки.
Если Вы верите в DDD, он прекрасно подходит для знания о некотором объекте под совокупным корнем, пока Вы не храните идентификатор или ссылку на него где-нибудь за пределами агрегата.
Я пошел бы для blogPost.AddComment(new Comment(...))
- версия.
Если Вы полагаете, что Комментарий агрегат BlogPost, и не иметь смысл из того объема затем необходимо использовать второй пример.
Совокупный корень должен управлять, как агрегаты инстанцируют так, их конструкторы не должны быть видимы за пределами совокупного корня.
Плюс, Комментарий должен быть дочерним классом BlogPost, если Вы хотите истинное отношение AggregateRoot-агрегата.