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.

Était-ce utile?

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é.

Je l'ai compris d'ici

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 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top