@anton_mra
Web-программист

Как создать составной ключ при сливании таблиц?

У меня есть метод который, заполняет БД значениями из таблицы.

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(потому что иначе просто добавляет запись повторно).
Помогите, пожалуйста справиться с этой задачей.
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы