Désolé pour mon mauvais anglais - j'utilise EF 5 (Code First) dans une application WPF (.net 4.5). Chaque fenêtre a son propre contexte.
J'ai un modèle comme celui-ci (code omis pour des raisons de brièveté) :
public class Car
{
public string Model { get; set; }
public int BrandId { get; set; }
public virtual Brand Brand { get; set; }
}
J'utilise des comboboxes pour permettre à l'utilisateur d'associer une Brand
à un Car
. Le problème est qu'à chaque fois que j'enregistre un Car
un nouveau, dupliqué Brand
sont également sauvegardés. Cela se produit parce que je charge la combobox avec AsNoTracking()
.
Maintenant, je charge la combobox avec AsNoTracking()
parce que j'avais du mal à charger les changements sur le Brand
réalisés dans d'autres instances de DbContext (à l'aide de myContext.Set<Brand>().Load()
).
Ma question est donc la suivante : comment résoudre ce problème ? S'il existe un autre moyen de forcer le rechargement d'une collection (sans utiliser la commande AsNoTracking
), ce serait bien. Il serait encore plus agréable de pouvoir informer EF que l'option AsNoTracking
Les entités chargées ne sont pas nouvelles.
EDIT 1 : @Mark : Merci, attacher l'entité au contexte a fait l'affaire. Mais j'utilise une classe de base générique qui fait la validation et enregistre les données pour tous mes formulaires, donc attacher manuellement les entités n'est pas très pratique... sur la base de votre suggestion, j'ai fini par faire ceci, après avoir ajouté l'entité Car et avant de l'enregistrer :
var entities = (((IObjectContextAdapter)ctx).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added));
foreach (var item in entities)
{
if ((item.Entity as EntityBase).Id > 0)
{
item.ObjectStateManager.ChangeObjectState(item.Entity, EntityState.Unchanged);
}
}
(toutes mes entités héritent d'EntityBase et toutes mes clés sont générées par la base de données). Cela a bien fonctionné mais j'aimerais avoir un deuxième avis... est-ce que c'est bon ou y a-t-il un moyen plus simple de le faire ?