Recharger une entité et l'ensemble de la Navigation de la Propriété de l'Association - DbSet Entity Framework
J'ai un problème avec l'entité de l'association d'actualisation. Quand j'ai une entité comme ceci:
MyContext context = new MyContext();
Person myPerson = context.PersonSet.FirstOrDefault();
String myPersonName = myPerson.Name;
Address myPersonAddress = myPerson.Address;
Je suis une personne avec une association nommée l'Adresse et une propriété nommée Nom. Si je modifie manuellement les données dans la base de données par exemple le Nom de la propriété, j'ai utiliser le code suivant pour recharger mon entité:
context.Entry(myPerson).Reload();
et j'ai la nouvelle valeur de Nom. Mais Si je fais la même chose pour l'Adresse, ça ne fonctionne pas. Je pense que c'est parce que l'Adresse est une propriété d'association. J'ai besoin de l'actualiser.
Comment puis-je faire pour forcer le rechargement de l'Adresse de l'association (et tous les autres de l'association dans la classe Personne) ?
EDIT:
Dans le même cas, une personne peut avoir plus d'une adresse.
MyContext context = new MyContext();
Person myPerson = context.PersonSet.FirstOrDefault();
String myPersonName = myPerson.Name;
List<Address> myPersonAddresses = myPerson.Addresses;
Dans ce cas, il n'est pas une Référence:
context.Entry(myPerson).Reference(p => p.Address).Load();
//Address will be populated with only the new address
//this isn't required because I use lazy loading
mais une Collection:
context.Entry(myPerson).Collection(p => p.Addresses).Load();
//Address will be populated with old value and new value
J'ai besoin de l'utiliser pour le travail:
context.Entry(myPerson).Collection(p => p.Addresses).CurrentValue.Clear();
context.Entry(myPerson).Collection(p => p.Addresses).Load();
Mais il ne semble pas être une bonne solution pour le faire pour tous mes propriétés de navigation!
- Voulez-vous dire que
context.Entry(myPersonAddress).Reload()
n' pas travail? - oui cela signifie qui NE fonctionne PAS. Parce que cette méthode de recharge uniquement la propriété (=Nom) et n'est pas l'association (=Adresse)
- Ah, désolé j'ai mal compris. Donc, vous ne voulez pas pour recharger les propriétés scalaires de la même
Address
entité mais le rapport à peut-être un autreAddress
entité. Hum, bonne question... - Ne
Person
avoir un exposé propriété de clé étrangère pour laAddress
propriété de navigation? - Comment puis-je exposer une propriété de clé étrangère ? Que voulez-vous dire ? J'ai une propriété de navigation dans mon .csdl
- Une propriété qui représente la clé étrangère à
Address
, quelque chose commepublic int AddressId { get; set; }
dans votrePerson
classe. - 😮 Désolé, j'ai mal compris. Oui, bien sûr, j'ai une propriété publique pour y accéder.
Vous devez vous connecter pour publier un commentaire.
Si vous n'utilisez pas le chargement paresseux, vous avez la charge de la nouvelle
Address
explicitement (comme vous avez dû le charger explicitement (avecInclude
, par exemple), lors du chargement de laPerson
initialement):Si vous utilisez le chargement paresseux, vous n'avez pas besoin du deuxième bloc de code. Néanmoins, vous obtenez une nouvelle requête à la base de données dès que vous accédez aux propriétés de la nouvelle
myPerson.Address
(comme vous avez une nouvelle requête dans le deuxième bloc de code ci-dessus), car la première ligne va marquer la propriété de navigation comme n'étant pas chargé si la personne se réfère à une nouvelle adresse dans la DB.Ce comportement ne dépend pas de savoir si vous avez exposé la clé étrangère dans la classe du modèle ou pas.
Il ne semble pas être un moyen pour appeler quelques-uns de magie
Reload
méthode qui permettrait de recharger et de mise à jour de l'ensemble de l'objet graphique dans un appel (comme il n'y a pas un seulInclude
avides de charger un objet graphique).Reference
parCollection
). Malheureusement, vous avez à le faire séparément pour chaque propriété de navigation (comme vous avez eu à utiliserInclude
pour chaque propriété de navigation pour impatient de chargement).Merci !
a fait son travail pour moi.
Si p est.Adresses perdu une entrée, il peut être actualisé par
mais si il a gagné une entrée, que votre .La méthode Load() a aidé. Merci encore!
Vous devez utiliser Query() extension de modifier votre expression LINQ. Ici c'est un exemple sur la base de mon personcal code. Dans ce code, je l'ai recharger les Adresses de la collection avec les AddressType propriété de navigation pour myPerson objet et place le résultat dans SomeList:
J'ai résolu ce problème avec l'aide de Détacher avant la lecture de l'objet de dbContext.
Cette méthode m'a permis d'actualiser toutes les propriétés de navigation de l'objet.
J'ai décrit mon scénario et les détails de la solution ici
Entity Framework: Recharger objet nouvellement créé /Recharger les propriétés de navigation