2011-04-02 3 views
2

J'utilise d'abord le code EF 4.1. J'ai deux classes:Entity Framework 4.1 Création d'entrées de recherche en double

public class Product { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public int ProductTypeID { get; set; } 
     public virtual ProductType ProductType { get; set; } 
} 

public class ProductType { 
     public int ID { get; set; } 
     public string Name { get; set; } 
} 

Si j'ai quelques ProductTypes existantes que je l'ai déjà créé (ID 2,3,4 par exemple), et je tente d'attribuer à l'un de ces ProductTypes à un nouveau produit, il va créer un duplicata du type de produit.

Par exemple, si mon plus grand ProductTypeID est 4, et j'exécutez le code suivant, il produira un double:

Expression<Func<ProductType, bool>> expr = s => s.ID == 2; 
ProductType t = DBContext.Set<ProductType>().Where(expr).First(); 
Product p = new Product(); 
p.ProductType = t; 
DBContext.SaveChanges(); 

Cela fait créer une nouvelle ligne dans la table « ProductType ». Le nouveau ProductType sera identique à celui avec l'ID 2, mais il aura le nouvel ID 5. Tout ce que j'essaie de faire est d'associer le type avec ID = 2 à mon nouveau produit. Une idée de ce que je fais mal?

+0

Je ne peux pas reproduire votre problème - Cela fonctionne correctement pour moi. Même si je ne vous vois pas ajouter d'objets aux contextes, voir la réponse d'Adi ci-dessous pour commencer. Si cette réponse n'est pas correcte, veuillez poster plus de code. – anon

+0

Vous avez raison. J'ai essayé de le simplifier, et j'ai négligé d'afficher le problème réel. J'essayais d'implémenter un modèle de référentiel et j'ai fini par créer deux objets DBContext distincts (un pour le produit et un pour le type). Après avoir réparé ça, ça a marché! – RepDetec

+1

Pourriez-vous peut-être partager quelques recherches sur ce sujet car je me bats avec le même problème en ce moment et voudrais comprendre ce que je fais mal. –

Répondre

0

Ceci est en fait une erreur commune en utilisant EF.

Vous devez ajouter le nouveau produit à DBContext:

Product p = new Product(); 
p.ProductType = t; 
DBContext.AddObject(p); //here 
DBContext.SaveChanges(); 
+0

Je ne vois pas réellement une méthode DBContext.AddObject (objet). Je me demande si elle a été supprimée pour 4.1? – RepDetec

+0

Je ne pense pas – Adi

+0

Il n'y a pas de méthode AddObject sur DbContext – Doug

0

Pourquoi vous chargez ProdutType la base de données? Vous avez une clé étrangère exposée sur votre entité, c'est ce dont vous avez besoin:

Product p = new Product(); 
p.ProductTypeId = 2; 
DBContext.Products.Add(p); 
DBContext.SaveChanges(); 
+0

Je suppose que je n'ai pas besoin de le charger, mais ne devrait-il pas fonctionner dans les deux sens? – RepDetec

Questions connexes