"Un objet avec la même clé existe déjà dans ObjectStateManager ..." exception est levée lors de la définition d'un état d'entité à modifier
J'ai suivi quelques exemples(y compris des livres tels que "Pro ASP.NET MVC 3" et "Professionnel ASP.NET MVC 3") pour créer simple ASP.NET MVC 3 applications à l'aide d'EF 4.1 (depuis que je suis nouveau à ces technologies).
Je suis en utilisant la suite du dépôt(seule instance de il est utilisé par toutes les méthodes d'action de la manette) pour accéder à la DB:
public class ProductRepository : IProductRepository
{
private readonly EFDbContext _context = new EFDbContext();
#region Implementation of IProductRepository
....
public void SaveProduct(Product product)
{
if (product.ProductId == 0)
{
_context.Products.Add(product);
}
else
{
_context.Entry(product).State = EntityState.Modified;
}
_context.SaveChanges();
}
....
}
Ce référentiel effectue la mise à jour comme cela est montré dans les exemples que j'ai utilisés.
Classe de produit:
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}
En cas de mise à jour du produit, je suis d'être l'exception "d'Un objet avec la même clé existe déjà dans le Vousmanager. Le Vousmanager ne peut suivre plusieurs objets avec la même clé"
Je sais que les questions similaires ont été déjà discuté ici, mais ma question est un peu différente:
Pourquoi ce code qui a été prise à partir d'exemples ne fonctionne pas (même si ça à l'air assez simple et directe)? Quel mal pourrais-je avoir fait ou oublié quelque chose.
source d'informationauteur andrew
Vous devez vous connecter pour publier un commentaire.
Après avoir cherché pendant des heures pour trouver une solution, j'ai trouvé un qui semble approprié après avoir fait assez de lecture.
La solution est ici:
Un objet avec la même clé existe déjà dans le Vousmanager. Le Vousmanager ne peut suivre plusieurs objets avec la même clé
Fondamentalement, aller chercher de l'enregistrement à partir du Contexte et de l'appeler:
Cela semble être une mauvaise idée et quelque chose que j'ai toujours détesté sur EF dans mes précédents ouvrages, mais cccording de Ladislav Mrnka (qui apparnently répond à tous les objectifs EF liés à la question sur Stackoverflow) dans ce post:
Entity Framework et le Regroupement de Connexion
EF stocker une demande d'une entité à l'interne, donc, idéalement, il sera déjà là et il ne sera pas de faire un appel supplémentaire à la base de données.
La cause racine du problème semble être qu'une fois qu'un produit est récupéré depuis le Contexte, le contexte est de garder la trace de cela et c'est ce qui est à l'origine de tous les problèmes. Afin de fusionner vos modifications en est le seul moyen.
Espère que ça aide.
Il semble que vous n'êtes pas la mise à jour de
product.ProductId
lorsque l'élément est enregistré pour la première fois. Cela signifie que lorsque vous revenez à enregistrer l'élément nouveau, c'est de l'ajouter à la contexte nouveau, d'où l'erreur.Comme l'Id sera ajouté par la base de données (je suppose que c'est l'Id généré automatiquement), alors vous aurez besoin de lire votre produit des données sur le client.
À partir d'un des Génériques point de vue, voici comment je dois résoudre le même problème très récemment: