EF から生成された 3 つのエンティティ、たとえば tab1、tab2、および tab3 があるとします。SL アプリでは、SubmitChanges を呼び出してデータを DB に保存します。すべての変更は WCF と EF によって自動的に処理されます。
質問: データベースでの更新操作の順序を知るにはどうすればよいですか?
これらのテーブルにトリガーがあり、更新の順序を知る必要があるため、これを知る必要があります。
EF から生成された 3 つのエンティティ、たとえば tab1、tab2、および tab3 があるとします。SL アプリでは、SubmitChanges を呼び出してデータを DB に保存します。すべての変更は WCF と EF によって自動的に処理されます。
質問: データベースでの更新操作の順序を知るにはどうすればよいですか?
これらのテーブルにトリガーがあり、更新の順序を知る必要があるため、これを知る必要があります。
できることの 1 つは、DomainService で PeristChangeSet() をオーバーライドし、保存の順序を手動で制御することです。通常の update/insert ステートメントでは何もしないでください。私の答えを説明するために、ドキュメントの例を保存するための擬似コードを次に示します。
[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;
}