У меня есть требование, которое, по моему мнению, должно происходить очень часто по всему миру. У меня есть две записи, которые связаны друг с другом, и всякий раз, когда в них вносится изменение, создается новая пара записей и сохраняется та же ссылка.
Требование, над которым я работаю, касается страховой отрасли, которая требует от меня деактивировать текущие страховые полисы и повторно активировать их в новом ряду, чтобы показать историю изменений, внесенных в страховые полисы. Когда они воссозданы, их все равно нужно связать вместе.
Пример того, как этот процесс предназначен для работы с представлением строк в базе данных:
Идентификатор страховки, Тип страховки, Основной идентификатор страховки, Статус
1, Автострахование, ноль, Актив
2, Страхование ветрового стекла, 1, Актив
Обратите внимание на то, как выше указана связь между этими полисами с помощью основного идентификатора страхования второй строки, указывающего идентификатор страхования первой строки.
В коде, который я пишу, я обрабатываю каждую из политик по одному, поэтому после первого шага у меня появляется следующее:
1, Автострахование, ноль, Неактивно
2, Страхование ветрового стекла, 1, Актив
3, Автострахование, ноль, Актив
Когда я обрабатываю вторую политику, я получаю следующее:
1, автострахование, ноль, неактив
2, страхование ветрового стекла, 1, Неактивно
3, Автострахование, ноль, Актив
4, страхование ветрового стекла, 1 , Active // должно быть 3, а не 1
Вы заметите, что когда я создаю новую страховку окна, поскольку мы копируем старую строку, мы получаем страховку Master Id, указывающую на неактивную строку.
Чтобы обойти это, я должен отслеживать основной страховой идентификатор предыдущего полиса, который был обработан, что привело к следующему коду:
int masterInsuranceId = -1;
foreach(Policy policy in policyList)
{
//copy the old policy so the new policy has
//the same details as the old one
Policy newPolicy = policyManager.Copy(policy);
//if the new policy is not the master insurance store
//the master its new master insuance
if(newPolicy.MasterInsuranceId.HasValue)
{
newPolicy.MasterInsuranceId = masterInsuranceId;
}
//save the details of the new policy
policyManager.SavePolicy(newPolicy);
//record the master id so we can update the master id
//reference on the next policy
if(newPolicy.MasterInsuranceId == null)
{
masterInsuranceId = newPolicy.Id;
}
else
{
masterInsuranceId = -1;
}
//inactivate the current policy
policy.Status = Inactive;
policyManager.UpdatePolicy(policy);
}
Кто-нибудь знает, как это можно упростить? Как лучше всего обеспечить, чтобы две записи оставались связанными друг с другом, даже если история изменений записывается для каждого изменения, внесенного в запись?