【问题标题】:RIA Services: Enumerate Deleted EntitiesRIA 服务:枚举已删除的实体
【发布时间】:2011-03-01 13:49:52
【问题描述】:

我的 RIA 服务上下文类有一个实体集 TaskToOperationAssociations,其中包含任务到操作关联的列表。

有没有办法“找到”已从集合中删除的关联实体?我可以看到上下文在其私有字段中引用了已删除的关联(显然需要对其进行跟踪,以便可以提交删除操作)。

这是一个例子......

如果我有与操作 X、Y 和 Z(ID 的 O1、O2 和 O3)相关联的任务“A”(ID=T1)和任务 B(ID=T2)与相同的操作相关联那么该集合将包含 3 个 TaskToOperationAssociations,如下所示...

  1. 关联 A1,TaskId = T1,OperationID = 1
  2. 关联 A2,TaskId = T1,OperationID = 2
  3. 关联 A3,TaskId = T1,OperationID = 3
  4. 关联 A4,TaskId = T2,OperationID = 1
  5. 关联 A5,TaskId = T2,OperationID = 2
  6. 关联 A6,TaskId = T2,OperationID = 3

我删除关联 A1 并捕获 TaskToOperationAssociations 的属性更改事件。在事件处理程序中,我想知道 Task T1 的任何关联是否已更改,以便我可以在 UI 上启用保存按钮。

希望这是有道理的。 谢谢 本

【问题讨论】:

    标签: .net silverlight silverlight-4.0 ria silverlight-toolkit


    【解决方案1】:

    您可以枚举 ChangeSet,ChangeSet 将包含提交之前的所有内容。在服务器端,您可以拦截 OnSaveChanges 并枚举 ChangeSet。

    对于现有的关联更改,大多数更改集将包含外键的更改。您当前 Context 的 Entity Container 将包含尚未提交的变更集。

    【讨论】:

    • 是的!我可以做 context.EntityContainer.GetEntitySet().Where(x => x.EntityState == EntityState.Deleted)。谢谢,在检查可用属性时,我一定认为 EntityContainer 是无用的或私有的。
    • 我删除了这个,因为我之前没有完全测试过它,当我确实来测试它时,它实际上并没有工作
    • 抱歉,您能解释一下您最后的评论吗?如果您已调用 AcceptChanges 或在您的实体上执行了 IEditableObject.EndEdit,您只会看到更改,这将标记要保存的更改。调用它的最佳时间是 OnSubmitChanges 方法,以查看将要提交的 ChangeSet。为此,您可以创建 DBContext 的部分类并覆盖 OnSubmitChanges 方法以检查更改。
    • 对不起,我的最后评论没有多大意义,我很着急,显然没有阅读我写的内容。它不是 DBContext,而是 System.ServiceModel.DomainServices.Client.DomainContext。我想在 OnSubmitChanges 之前枚举已删除的实体,看看是否有任何更改要提交,这样我就可以在 UI 中启用一个按钮。
    • DBContext 将是 RIA 服务创建的类,从 DomainContext 派生,请单击显示所有文件夹并在灰色的 Web 文件夹中查看 cs 文件,您将看到类的名称。您将必须创建一个同名的部分类作为您的上下文。例如,如果您的服务名称是 Web 项目中的 OrganizationService,那么上下文的名称将是 OrganizationContext 并创建部分类并覆盖 On Submit 更改。
    【解决方案2】:

    也许这对你有帮助

    var deleted = Context.EntityContainer.GetChanges().RemovedEntities
        .Where(re => re is TaskToOperationAssociations && ((TaskToOperationAssociations)re.GetOriginal()).TaskId == T1.Id)
        .Select(re => (TaskToOperationAssociations)re);
    

    或者只是

    var hasDeleted = Context.EntityContainer.GetChanges().RemovedEntities
        .Any(re => re is TaskToOperationAssociations && ((TaskToOperationAssociations)re.GetOriginal()).TaskId == T1.Id)
    

    查看是否有任何已删除的 T1 关联

    foreach (var assoc in deleted)
    {
       Context.TaskToOperationAssociations.Add(assoc);
       ((IRevertibleChangeTracking)assoc).RejectChanges();
       ((IRevertibleChangeTracking)T1).RejectChanges();
    }
    

    您可以完全撤消删除(如果您尚未提交更改)

    【讨论】:

    • 感谢 Fabiano 的回答,我明天要离开这家公司,但我会将答案传递给其他人,看看他们将来是否可以使用它。可惜你没有早点来这里,因为有赏金:)
    • 您确定 RejectChanges 代码会起作用吗?看起来您正在更改您正在枚举的集合:) 无论如何我都不需要这样做,但其他东西看起来很棒并且可以编译,这是一个不错的开始。明天我会全面测试。
    【解决方案3】:

    仅使用上下文是无法做到这一点的。我通过手动包装上下文和跟踪删除来修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多