У меня есть метод который, заполняет БД значениями из таблицы.
static void PopulateDatabaseStock(OPCDBEntities context, List<StockOnHand> entries,
out TimeSpan time)
{
Stopwatch timer = new Stopwatch();
timer.Start();
IEnumerable<StockOnHand> entriesToAdd = EFUtils.MergeEntities(context.StockOnHands, entries, x => x.StockId);
context.StockOnHands.AddRange(entriesToAdd);
context.SaveChanges();
timer.Stop();
time = timer.Elapsed;
}
И есть метод, который либо добавляет новые записи, либо обновляет существующие
/// <summary>
/// Helps to merge two entity lists together.
/// Updates entities in first list matched by provided ID in second list
/// </summary>
/// <param name="persistedEntities">Entities in database</param>
/// <param name="toMergeEntities">Entities not managed by database</param>
/// <param name="idFn">Identity function. Must return object with valid GetHashCode() and Equals()</param>
/// <typeparam name="T">Entity class</typeparam>
/// <typeparam name="ID">Identity class</typeparam>
/// <returns>list of new entities which were not found in database</returns>
public static IEnumerable<T> MergeEntities<T, ID>(IEnumerable<T> persistedEntities,
IEnumerable<T> toMergeEntities, Func<T, ID> idFn) where T : IUpdatableFrom<T>
{
Dictionary<ID, T> persistedDict = persistedEntities.ToDictionary(idFn);
List<T> toAddEntities = new List<T>();
foreach (var entity in toMergeEntities)
{
ID id = idFn.Invoke(entity);
if (!persistedDict.ContainsKey(id))
{
toAddEntities.Add(entity);
}
else
{
persistedDict[id].TryUpdateFrom(entity);
}
}
return toAddEntities;
}
Сейчас он проверяет по первичному ключу StockId (Guid), но мне нужно чтобы он проверял по двум ключам StoreId, PartNumber(потому что иначе просто добавляет запись повторно).
Помогите, пожалуйста справиться с этой задачей.