Entity Framework / .Net 4.0: POCO et enregistrement de plusieurs relations en un
-
06-07-2019 - |
Question
Comment dois-je configurer une propriété pour que, lors de l'utilisation de SaveChanges, la relation plusieurs à un soit sauvegardée et que l'instruction: INSERT ne soit pas en conflit avec la contrainte FOREIGN KEY ... error.
Assez simple, j’ai une annonce et un type d’adresse contenant plusieurs annonces associées à un seul type. Il y a une propriété sur l'annonce:
public class Ad
{
public Int32 AdTypeId { get; set; }
public virtual AdType AdType { get; set; }
}
Pour couvrir cette relation.
Quand je fais cela:
someAd.AdType = someAdType;
La propriété est correctement définie, mais pas AdTypeId. Pas de soucis cependant puisque je suppose que ce serait ok pour économiser.
context.SaveChanges();
Le problème est qu’il tente à présent d’enregistrer la valeur 0 dans la colonne AdTypeId (provoquer un problème de clé étrangère) au lieu d’utiliser la propriété AdType affectée à l’objet pour déterminer ce qu’elle doit insérer dans la colonne AdTypeId.
Ce que je sais:
- À ce stade, someAdType est a persisté / a un identifiant.
- La propriété AdType est définie correctement.
- Le AdTypeId est 0.
- Il existe une relation de clé étrangère dans la base de données.
- AdTypeId est une clé primaire.
- Le chargement différé / différé est défini sur true
Je n'ai pas vraiment essayé de changer le AdType, car il est configuré pour permettre le chargement paresseux.
La solution
Ok, parce que j'utilise le type de suivi non proxy (fait de ce mot ... oui) "Suivi du changement basé sur un instantané". approche, le système n'a pas vraiment idée qu'il a changé.
Dans cet exemple, le client est un pur Type de POCO. Contrairement à EntityObject ou Entités basées sur IPOCO, apportant des modifications à l'entité n'est pas automatiquement garder le gestionnaire d'état en synchronisation parce que il n'y a pas de notification automatique entre vos entités POCO pures et le cadre d'entité. Par conséquent, sur interroger le gestionnaire de l'état, il pense que l'état de l'objet client est Inchangé même si nous avons fait explicitement un changement à l'un des propriétés sur l'entité.
Donc, afin de s'assurer qu'il sait vérifier s'il y a eu un changement, je dois utiliser le AcceptAllChangesAfterSave avec la méthode SaveChanges.
context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
Et ça marche. Si tout va bien je le comprends correctement ...