如何通过Domain context SubmitChanges了解更新顺序?

时间:2013-01-07 16:07:39

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以做的一件事是覆盖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;
}