-1

データソースがEntitySpacesコレクションに設定されたグリッドがあり、チェックボックス列があります。チェックボックスがオンの場合はレコードを作成し、オフの場合は同じレコードを削除します。

ユーザーがアイテムのチェックとチェック解除を繰り返した場合の明らかなPK違反の保存を回避するために、以前に削除されたエンティティを取得し、それらを削除されていないものとしてマークしようとしています。ただし、コレクションで and を使用するCombineDeletedEntitiesSeparateDeletedEntities、コレクションに重複するエントリが作成されます。

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();

したがって、基本的にFindByPrimaryKey3 回目にすると、EntitySpaces が何らかの形で追加のアイテムを作成しInvalidOperationExceptionSequence contains more than one matching element.

以前にEntitySpacesでこれを打った人はいますか?単一のセッションで同じエンティティを複数回作成および削除するユーザーをどのようにうまく処理しましたか?

4

1 に答える 1

0

特に EntitySpaces はオープン ソースであるため、これはかなり簡単に修正できました。重複レコードの作成を避けるために使用していた 2 つの方法を以下に示します。

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 に答える