【问题标题】:How to know the order of update with Domain context SubmitChanges?如何知道域上下文 SubmitChanges 的更新顺序?
【发布时间】:2013-01-07 16:07:39
【问题描述】:

假设我有 3 个从 EF 生成的实体,例如 tab1、tab2 和 tab3。在 SL 应用程序中,我调用 SubmitChanges 将数据保存到 DB,所有更改将由 WCF 和 EF 自动处理。

问题是:如何知道数据库中更新操作的顺序?

我需要知道这一点,因为我在这些表上有触发器并且需要知道更新的顺序。

【问题讨论】:

  • 如果触发器正在修改与 EF 相同的实体,则它们可能不会很好地配合使用。您应该考虑删除触发器并在 .NET 中重新实现该代码。我们在上下文中覆盖 SaveChanges 方法并在那里运行类似触发器的逻辑。
  • 谢谢。从遗留系统触发,我不想在 .NET 代码中实现它,因为这会导致很多问题。
  • 操作顺序是内部 EF 行为 = 您无法可靠地知道将使用什么操作顺序。
  • @KentZhou 正如拉迪斯拉夫所说,你真的不知道使用了什么顺序。您最好的选择是在每次插入后调用 SubmitChanges。
  • 我遇到了类似的问题,我需要控制更新的执行顺序,但找不到任何答案。解决方法是单独提交更改以按我需要的顺序更新表格。

标签: silverlight entity-framework wcf-ria-services silverlight-5.0 entity-framework-5


【解决方案1】:

您可以做的一件事是在您的 DomainService 中覆盖 PeristChangeSet() 并手动控制保存的顺序。在您的常规更新/插入语句中什么都不做。这是一些用于保存文档示例的伪代码来解释我的答案:

[Insert]
public void InsertDocument(MyDocument objDocument) { }

[Update]
public void UpdateDocument(MyDocument objDocument) { }


protected override bool PersistChangeSet()
{
    try {
        // have to save document first to get its id....
        MyDocument objDocumentBeingSaved = null;
        foreach (ChangeSetEntry CSE in ChangeSet.ChangeSetEntries.Where(i => i.Entity is MyDocument)) {
            var changedEntity = (MyDocument)CSE.Entity;
            objDocumentBeingSaved = documentRepository.SaveDocument(changedEntity);
            break; // only one doc
        }

        if (objDocumentBeingSaved == null)
            throw new NullReferenceException("CreateDocumentDomainService.PersistChangeSet(): Error saving document information. Document is null in entity set.");

        // save document assignments after saving document object
        foreach (ChangeSetEntry CSE in ChangeSet.ChangeSetEntries.Where(i => i.Entity is DocumentAssignment)) {
            var changedEntity = (DocumentAssignment)CSE.Entity;
            changedEntity.DocumentId = objDocumentBeingSaved.Id;
            changedEntity.Id = documentRepository.SaveDocumentAssignment(objDocumentBeingSaved, changedEntity);
        }

        // save line items after saving document assignments
        foreach (ChangeSetEntry CSE in ChangeSet.ChangeSetEntries.Where(i => i.Entity is LineItem)) {
            var changedEntity = (LineItem)CSE.Entity;
            changedEntity.DocumentId = objDocumentBeingSaved.Id;
            changedEntity.Id = documentRepository.SaveLineItem(objDocumentBeingSaved, changedEntity);
        }
        documentRepository.GenerateDocumentNumber(objDocumentBeingSaved.Id);
    }
    catch {
        // ....
        throw;
    }
    return false;
}

【讨论】:

  • 谢谢。这种硬编码解决方案对我的情况来说非常困难。 DB中有很多表(然后每次在ChangeSet中提交更改)。当 EF SaveChanges 时,它应该对变更集中的那些实体使用一种顺序。是否可以在提交到数据库之前更改订单?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2020-12-25
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多