2014-09-10 39 views
0

我有一个网格,数据源设置为EntitySpaces集合,并带有一个复选框列。当复选框被选中时,我想创建一个记录,当它被清除时,我想删除相同的记录。CombineDeletedEntities/SeparateDeletedEntities添加重复实体

为了避免明显的PK违规保存如果用户反复检查和取消选中项目,我试图检索以前删除的实体并将它们标记为未删除。但是,当我在集合上使用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(); 

所以基本上,当我做FindByPrimaryKey第三次,EntitySpaces创造不知何故一个附加项目,这会导致一个InvalidOperationExceptionSequence contains more than one matching element的消息。

有没有人在EntitySpaces之前打过这个,以及你是如何很好地处理用户在单个会话中多次创建和删除同一个实体的?

回答

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

综观上面变得相当明显,代码将继续我们每次打电话SeparateDeletedEntities时间重新添加同一实体进入deletedEntities列表。

最简单的办法是清除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集合可能会导致您的保存跳过所有删除操作。

我希望只需在SeparateDeletedEntities例程中添加if (!deletedEntities.Contains(entity))调用,但相等比较看到的实体不同,因此我采用了更简单的解决方案。