ИМХО Вдохновленный из @Vadim Мартынова
Если Product_ID
вашего первичный ключ, и ваш набор для увеличения ключа из базы данных. Не делайте этого Product_ID = val.Product_ID
. Ключ должен быть создан из базы данных. Вы получите идентификатор после вызова изменений сохранения.
try
{
var str = from a in db.ProductStatisticsTemp select a;
//This will improve some performance
db.Configuration.AutoDetectChangesEnabled = false;
foreach (var val in str.ToList())
{
ProductStatistics ls = new ProductStatistics
{
Product_ID = val.Product_ID,
ProductNameEn = val.ProductNameEn,
ProductNameAr = val.ProductNameAr
};
//use AddRange or Add based on your EF Version.
db.ProductStatistics.Add(ls);
}
db.SaveChanges();
}
finally
{
db.Configuration.AutoDetectChangesEnabled = true;
}
Если вы используете AddRange
можно опустить db.Configuration.AutoDetectChangesEnabled = false
Для получения дополнительной информации о DetectChanges
доступных here метод
AddRange() поддерживают только от EF6 см documentation
db.ProductStatistics.AddRange(products);
Что AddRange будет делать для вас
если AutoDetectChangesEnabled is set to true
(который по умолчанию), то DetectChanges будет вызываться один раз, прежде чем добавлять любые объекты и не будет вызываться снова.
Это означает, что в некоторых ситуациях приложение AddRange может выполнять значительно лучше, чем позвонить. Добавление нескольких раз.
Обратите внимание, что объекты, которые уже находятся в контексте в каком-либо другом состоянии, будут иметь свой статус в Добавлен. AddRange - это no-op для объектов, которые уже находятся в контексте в добавленном состоянии.
Вам нужно переместить 'ProductStatistics ls = new ProductStatistics();' внутрь цикла (и вы можете перемещать 'db.SaveChanges();' после цикла). –
Если вы хотите использовать один и тот же объект, тогда все его свойства должны быть сброшены, –