-1

我有一个将数据源设置为EntitySpaces集合的网格,并带有一个复选框列。当复选框被选中时,我想创建一条记录,当它被清除时,我想删除相同的记录。

如果用户反复检查和取消选中某个项目,为了避免明显的PK违规保存,我试图检索以前删除的实体并将它们标记为未删除。但是,当我在集合上使用CombineDeletedEntitiesandSeparateDeletedEntities时,它会在集合中创建重复的条目。

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 解决过这个问题,你是如何在一个会话中很好地处理用户多次创建和删除同一个实体的?

4

1 回答 1

0

这是一个相当简单的修复,特别是因为 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,但是相等比较认为实体不同,所以我选择了更简单的解决方案。

于 2014-09-18T14:11:39.520 回答