J'ai une exigence que je crois doit se produire très fréquemment dans le monde entier. J'ai deux enregistrements qui sont liés ensemble et chaque fois qu'une modification est apportée à eux, une nouvelle paire d'enregistrements doit être créée et conserver le même lien.Comment conserver facilement les enregistrements d'une base de données reliés entre eux?
L'exigence sur laquelle je travaille concerne le secteur de l'assurance, ce qui nécessite de désactiver les polices d'assurance actuelles et de les réactiver dans une nouvelle rangée afin de montrer l'historique des modifications apportées aux polices d'assurance. Quand ils sont recréés, ils doivent toujours être reliés entre eux.
Un exemple de la façon dont ce processus est destiné à travailler à la vue des lignes dans une base de données:
assurance Id, assurance type, Maître d'assurance Id, Statut
1, Assurance Auto, null, Active
2, l'assurance de l'écran du vent, 1, active
Remarque dans ce qui précède comment le lien entre ces politiques est désigné par le Maître d'assurance Id de la deuxième rangée pointant le l'assurance Id de la première rangée.
Dans le code que je vous écris, je suis en train de traiter chacune des politiques un à la fois si après la première étape, je donne les résultats suivants:
1, Assurance Auto, null, inactif
2 , l'écran du vent d'assurance, 1, active
3, assurance Auto, null, active
Lorsque je traite la deuxième politique que j'obtenir le fol mugissement:
1, Assurance Auto, null, inactif
2, l'assurance de l'écran du vent, 1, inactif
3, Assurance Auto, null, Active
4, Assurance de l'écran du vent , , Actif // doit être 3 non 1
Vous remarquerez que lorsque je crée la nouvelle fenêtre d'assurance que, puisque nous copions l'ancienne ligne, nous finissons par avec l'assurance Master Id pointant vers la ligne inactive.
Pour contourner ce problème, je dois garder une trace de l'ID d'assurance maître de la politique précédente qui a été traitée qui a conduit au code suivant:
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);
}
Est-ce que quelqu'un sait comment cela peut être simplifié? Quelle est la meilleure façon de s'assurer que deux enregistrements resteront liés les uns aux autres, même si un historique des changements est enregistré pour chaque changement apporté à l'enregistrement?
Malheureusement, je ne connais pas beaucoup sql ou beaucoup sur le schéma de base de données ... et je ne serais pas autorisé à le changer même si je le voulais.Je crois fortement que ce serait mieux géré ailleurs où ... Je ne sais pas où ... – mezoid
À mon humble avis, ce problème est dans le domaine de la relation d'entité. Vous pouvez le faire par code, mais je ne peux pas penser à une solution autre que celle que vous avez déjà. C'est pourquoi pour une application intensive en données, faites bien le schéma, et ce sera plus facile à partir de maintenant –
Extrakun