2010-12-09 23 views
6

Je rencontre un problème lors de l'utilisation d'EF4 lorsque j'essaie de vérifier si l'objet se trouve déjà dans le contexte Entity Framework.Vérifiez si l'objet se trouve déjà dans le contexte Entity Framework

J'ai ce code ci-dessous

 var entityName = Entity4Test + Guid.NewGuid(); 

     using(var ctx = new EnviroDataContext()) 
     { 
      var etc = new Entity 
      { 
       Name = entityName 
      }; 

      ctx.Entity.AddObject(etc); 

       var q = from p in ctx.Entity 
         where p.Name == entityName 
         select p; 

// Why 'q.ToList().Count == 0'? 

       ctx.SaveChanges(); 
      } 

Ma question est, pourquoi ma recherche après l'insertion, est sorti vide?

Je sais que les données sont conservées après 'SaveChanges', mais que faire si j'ai besoin de 'interroger' mes données de mémoire d'entité.

L'extension de la question

J'ai une règle métier en ajoutant 1 point A, déclenche l'insertion des entités autres B. La question est, je règle de validation lors de l'insertion de B, t A doit déjà exister.

Parce que toutes ces actions sont effectuées avant 'SaveChanges', j'obtiens une erreur que EntityA n'existe pas.

Autre cas, J'ai un champ Nom unique sur une table. Si j'essaie d'exécuter AddEntityName ("bla") deux fois puis "SaveChanges", j'obtiens une exception de DB [Contraintes uniques], même après avoir passé ma validation pour l'insertion, qui garantit qu'un nom est unique.

Quelqu'un a une idée?

Répondre

9

Lorsque vous faites .AddObject, il l'ajoute au "graphique" interne (mémoire) d'EF dans un état en attente de "Ajouté".

Une fois que vous aurez fait ctx.SaveChanges(), les modifications seront conservées dans le magasin sous-jacent.

La requête que vous écrivez est par rapport à la base de données et la modification n'a pas encore été conservée. Donc, si vous exécutez votre requête après vous faites ctx.SaveChanges(), le nombre sera comme prévu.

Sur une note de côté, si vous voulez voir si une entité est déjà dans le graphique (par exemple avant « attach »), lire sur ObjectStateManager.TryGetObjectStateEntry.

+0

Je comprends ce que vous dites, mais la question est, si ce comportement est logique, si vous avez des règles métier qui impliquent plus d'insertions et de validations? – muek

+0

@muek - désolé, je ne comprends pas votre question. Que voulez-vous dire? – RPM1984

+0

lol ma mauvaise. consultez ma question étendue. – muek

1

Je n'ai pas utilisé EF4 mais j'ai utilisé la version précédente, donc je ne sais pas si c'est une attente différente dans EF4. Il semble que vous essayez de rechercher l'actif dans la base de données avant de le valider. Vous devez d'abord appeler SaveChanges, puis le rechercher.