Чтобы расширить комментарий Стива, проблема, скорее всего, не в EF или добавлении элементов в DbSet, а в том, как вы заполняете список сущностей для сохранения.
Возьмем, к примеру,
List<ProductImage> productImages = new List<ProductImage>();
Product product = context.Products.Single(x => x.ProductId == productId);
ProductImage productImage = new ProductImage();
for (int count = 1; count < 5; count++)
{
productImage.ImageNumber = count;
productImage.Product = product;
productImages.Add(productImage);
}
// ...
context.ProductImages.AddRange(productImages);
Проблема с приведенным выше кодом заключается в том, что цикл просто обновляет одну и ту же единственную ссылку объекта ProductImage.Список будет содержать 5 ссылок на одно и то же изображение, и номер этого изображения будет «5».
Вместо этого:
List<ProductImage> productImages = new List<ProductImage>();
Product product = context.Products.Single(x => x.ProductId == productId);
for (int count = 1; count < 5; count++)
{
ProductImage productImage = new ProductImage();
productImage.ImageNumber = count;
productImage.Product = product;
productImages.Add(productImage);
}
// ...
context.ProductImages.AddRange(productImages);
Перемещая конструктор для ProductImage в цикл, каждое изображение является отдельной ссылкой, в результате чего в коллекции 5 уникальных элементов.
Важной деталью является то, что если все изображения относятся к одному и тому же продукту, вы делаете используете одну ссылку на продукт для всех изображений.Загружен ли этот продукт из базы данных (см. Выше) или создан как новый элемент.Типичные ошибки, с которыми сталкиваются разработчики, плохо знакомые с EF:
List<ProductImage> productImages = new List<ProductImage>();
for (int count = 1; count < 5; count++)
{
Product product = new Product { ProductId = productId };
ProductImage productImage = new ProductImage();
productImage.ImageNumber = count;
productImage.Product = product;
productImages.Add(productImage);
}
// ...
context.ProductImages.AddRange(productImages);
Где у них может быть существующий идентификатор продукта, выбранный пользователем, и они не хотят обращаться к базе данных, чтобы загрузить его, поэтому онипросто создайте сущность Product и установите ID, думая, что все будет хорошо.Проблема здесь заключается в том, что каждый экземпляр Product будет отдельным экземпляром, и когда вы добавите ProductImage в DbSet, все неотслеживаемые объекты, связанные с этим образом продукта (в данном случае Product), будут также обрабатываться как «Добавления».В результате 5 новых идентичных Продуктов (с новыми идентификаторами) будут добавлены в базу данных при условии, что Идентификатор продукта PK был настроен как Идентичность, или вы получите ошибку при вставке дублирующих идентификаторов.С EF важно работать с уникальными экземплярами, где вы хотите создать уникальные записи, и работать с одним экземпляром (загруженным из БД, созданным новым или созданным как заглушка и присоединенным к контексту), где вы хотите сослаться на один экземпляр.существующая или новая строка.