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
рутина, но сравнение равенства рассматривает сущности как разные, поэтому я выбрал более простое решение.