Obtenez de l'entité propriétés de navigation après l'insertion
J'ai les 2 classes:
public class Reward
{
public int Id { get; set; }
public int CampaignId { get; set;
public virtual Campaign Campaign { get; set; }
}
public class Campaign
{
public int Id { get; set; }
public virtual ICollection<Reward> Rewards { get; set; }
}
Avec ce que j'ai les choses nécessaires comme un DbContext et des mappages.
Maintenant, disons que je crée une Récompense de l'entité et de l'insérer comme ceci:
var reward = new Reward { CampaignId = 1 };
context.Set<Reward>().Add(reward);
context.SaveChanges();
reward = context.Set<Reward>().SingleOrDefault(a => a.Id == reward.Id);
//reward.Campaign is null
J'ai évidemment avoir une campagne avec l'Id 1, le FK contrainte est heureux. Après cette insertion, ma récompense entité a sa nouvelle Identité set Id. Maintenant, le problème est que la récompense est toujours la Récompense de l'entité que j'ai créé. Et avec cela, la récompense.Campagne de propriété est null. Il semble que EF est de garder l'insertion des entités dans la mémoire, et quand je puis faire .SingleOrDefault(a => un.Id == récompense.Id) retourne simplement l'entité dans la mémoire, et pas un nouveau proxy. C'est probablement une bonne chose.
La question est donc: Comment fait-on de l'accès ou de charger les propriétés de navigation après une insertion ou d'obtenir un nouveau proxy qui a les propriétés de navigation en tant que fondés de pouvoir ainsi.
Suis-je peut-être insérer dans le mauvais sens?
- Quel est votre cartographie ressembler?
- double possible de Entity Framework: j'ai mis la clé étrangère, SaveChanges ensuite accéder à la propriété de navigation, mais il ne charge pas l'entité associée. Pourquoi pas?
Vous devez vous connecter pour publier un commentaire.
Si je vous comprends bien, vous essayez de ardemment charge d'une propriété complexe après l'établissement d'une relation via une clé étrangère de la propriété.
SaveChanges()
ne pas faire quelque chose dans le mode de chargement des propriétés complexes. En plus, il va configurer votre clé primaire de la propriété si vous êtes en train d'ajouter de nouveaux objets.Votre ligne
reward = context.Set<Reward>().SingleOrDefault(a => a.Id == reward.Id);
aussi ne rien dans la manière de chargement
Campaign
parce que votre récompense objet n'est pas attachée au contexte. Vous devez explicitement dire EF charger que l'objet complexe ou attachez-le puis laissez-le chargement paresseux travailler sa magie.Donc, après vous
context.SaveChanges();
vous disposez de trois options pour le chargementreward.Campaign
:Attach()
récompense pour le contexte, de sorte queCampaign
peut être paresseusement chargé (chargé lors de l'accès)Remarque: Vous ne pourrez lazy load
reward.Campaign
dans le cadre du champ d'application de sorte que si vous n'allez pas à accéder à toutes les propriétés dans le contexte de la durée de vie, l'utilisation de l'option 2 ou 3.Manuellement
Load()
laCampaign
propriétéManuellement
Include()
laCampaign
propriétéBien, je te suggère de
Load
puisque vous avez déjàreward
dans la mémoire.Découvrez le Chargement d'Objets Liés à la Section sur ce doc msdn pour plus d'informations.
Que vous créez votre
reward
objet commenew Reward()
, EF ne dispose pas d'un proxy. Au lieu de cela, créer à l'aide de DbSet.Créer comme ceci:Suivant l'attacher à votre DbSet:
Enfin, vous pouvez maintenant utiliser le chargement paresseux pour obtenir des entités liées:
Avez-vous essayez d'utiliser
Include()
? Quelque chose comme ceci:J'ai une Solution simple de contourner le problème.
au lieu d'ajouter le CampaignID à la récompense, ajouter l'Objet de campagne.. donc:
Entity framework fait tout le levage lourd ici.
Vous pensez probablement que c'est une perte de charge de l'ensemble de la Campagne de l'objet, mais si vous allez l'utiliser (à partir de ce qu'il semble, il semble que vous êtes), alors je ne vois pas pourquoi pas.
Vous pouvez même utiliser l'instruction include lors de la récupération au-dessus si vous devez accéder aux propriétés de navigation de l'objet de Campagne...
En plus de Carrie Kendall et DavidG (en VB.NET):
Puis, bien
r.Campaign
est disponible