CombineDeletedEntities/SeparateDeletedEntities Добавление дублирующихся объектов

У меня есть сетка с источником данных, установленным в коллекцию EntitySpaces, со столбцом флажка. Когда флажок установлен, я хочу создать запись, а когда она снята, я хочу удалить ту же запись.

Чтобы избежать явного нарушения PK, если пользователь неоднократно проверяет и снимает отметку с элемента, я пытаюсь восстановить ранее удаленные объекты и пометить их как не удаленные. Тем не менее, когда я использую CombineDeletedEntities а также SeparateDeletedEntities в коллекции создаются повторяющиеся записи в коллекции.

roleFunctions.CombineDeletedEntities();

// On third cycle through, this is the error line
RoleFunction foundItem = roleFunctions.FindByPrimaryKey(roleName, functionName);

if (foundItem != null) 
{
    foundItem.RowState = esDataRowState.Unchanged;

    // Extraneous logic...
}
else
{
    // Create new item...
}

roleFunctions.SeparateDeletedEntities();

Так что в основном, когда я делаю FindByPrimaryKey в третий раз EntitySpaces создал дополнительный элемент, который вызывает InvalidOperationException с сообщением Sequence contains more than one matching element,

Кто-нибудь сталкивался с этим с помощью EntitySpaces раньше, и как вам удалось обработать пользователя, создающего и удаляющего одну и ту же сущность несколько раз за один сеанс?

1 ответ

Решение

Это было довольно легко исправить, тем более что EntitySpaces является открытым исходным кодом. Два метода, которые я использовал, чтобы избежать создания повторяющихся записей, показаны ниже:

public override void CombineDeletedEntities()
{
    if (this.deletedEntities != null && this.deletedEntities.Count > 0)
    {
        foreach (T entity in deletedEntities)
        {
            entities.Add(entity);
        }
    }
}

public override void SeparateDeletedEntities()
{
    foreach (T entity in this.entities)
    {
        if (entity.rowState == esDataRowState.Deleted)
        {
            if (deletedEntities == null)
            {
                deletedEntities = new BindingList<T>();
            }

            deletedEntities.Add(entity);
        }
    }

    if (this.deletedEntities != null && this.deletedEntities.Count > 0)
    {
        foreach (T entity in deletedEntities)
        {
            entities.Remove(entity);
        }
    }
}

Глядя на вышесказанное, становится достаточно очевидным, что код продолжит добавлять те же сущности в deletedEntities список каждый раз, когда мы звоним SeparateDeletedEntities,

Простым решением было очистить deletedEntities Коллекция, когда она объединена с собственно коллекцией:

public override void CombineDeletedEntities()
{
    if (this.deletedEntities != null && this.deletedEntities.Count > 0)
    {
        foreach (T entity in deletedEntities)
        {
            entities.Add(entity);
        }

        this.deletedEntities.Clear();
    }
}

Недостатком этого быстрого и грязного решения является то, что вы, вероятно, не хотите звонить collection.Save() после звонка CombineDeletedEntities пока ты не позвонил SeparateDeletedEntitiesс пустым deletedEntities коллекция, вероятно, заставит ваше сохранение пропустить все удаления.

Я хотел бы просто добавить if (!deletedEntities.Contains(entity)) позвонить в SeparateDeletedEntities рутина, но сравнение равенства рассматривает сущности как разные, поэтому я выбрал более простое решение.

Другие вопросы по тегам