ファイルからデータを挿入したり、存在する場合は更新したりするコードを実行していたときに、大きな問題が発生しました。エンティティ フレームワークを使用しています。ファイルは 16,000 行近くあります
私はそれらを挿入しようとしましたが、これを行うのに多くの時間を費やしました: 5 時間以上 x ファイル。
変更することにしましたが、開始方法がわかりません。
1000、5000、10000行ごとに保存することについて何かを読みましたが、それをしようとすると例外が発生しました。
Store update, insert, or delete statement affected an unexpected number of rows (0).
Entities may have been modified or deleted since entities were loaded. Refresh
ObjectStateManager entries.
修正しようとすると、この例外が発生しました
AcceptChanges can not continue because the object's key values conflict with another
object in ObjectStateManager. Make sure that the key values are unique before calling
AcceptChanges.
これは私のコードです
//before this I passed db data to lists
foreach (var record in records)
{
if (record != null)
{
try
{
if (!_location.Any(s => s.Id.Trim() == record.Id))
{
Location l = new Location
{
Id = record.Id,
Name = record.Name,
Address = record.Address,
City = record.City,
State = record.State,
Zip = record.Zip.ToString(),
Zip2 = record.Zip2,
Custom1 = record.Custom1,
CreatedDate = date,
UpdatedDate = date
};
db.location.Add(l);
db.SaveChanges();
_location.Add(l);
}
else
{
if (!_sales.Any(s => s.LocationId == record.Id && s.ReportDate == record.ReportDate))
{
Sale s = new Sale
{
ReportDate = record.ReportDate,
CreatedDate = date,
UpdatedDate = date,
Amount = record.Amount,
LocationId = record.Id,
};
db.Sale.Add(s);
db.SaveChanges();
_sales.Add(s);
}
else
{
if (!_sales.Any(s => s.LocationId == record.Id && s.ReportDate == record.ReportDate && s.Amount == record.Amount))
{
if ((_sales.Where(s => s.LocationId == record.Id && s.ReportDate == record.ReportDate)).Count() == 1)
{
var sale = _sales.SingleOrDefault(s => s.LocationId == record.Id && s.ReportDate == record.ReportDate);
sale.UpdatedDate = date;
sale.Amount = record.Amount;
db.Entry(sale).State = EntityState.Modified;
db.SaveChanges();
}
}
}
}
}
catch (Exception ex)
{
}
}
}
私が行った変更は次のとおりです。
すべての db.SaveChanges を foreach の最後で 1 つだけ変更すると、最初の例外が発生しました (これも 3000 でグループ化した場合)
エンティティの状態を変更すると、2 番目の例外が発生しました。
あなたの助けに感謝します。
ありがとう。