2010-08-10 4 views
2

J'utilise Entity Framework 4.0 entité POCO Je cartographié procédure stockée personnalisée sur insert PROCEDURE [dbo]. [Usp_MyTable_Insert] ( @ valeur1 char (1), @ Valeur2 varchar (5), @ Value3 varchar (20) .... ) AS BEGIN TRANSACTION INSERT INTO "dbo". "MyTable" ( "valeur1", "Valeur2", "Valeur3" ) VALEURS ( @ Valeur1, Valeur2 @, @ Value3 )EF 4.0 Entité ne choisit pas de nouvelles valeurs après insertion (entité select après insertion)

DECLARE @Id int --get la dernière Id. SET @Id = (SELECT CAST (@@ IDENTITY AS INT))

--update la table avec les valeurs des UPDATE "dbo". "MyTable" SET Value3 = (SELECT SomeTableColumn OU DE SomeTable quelque chose = quelque chose ) OÙ [Id] = @Id

COMMIT TRANSACTION

SELECT @Id AS "Id"

FIN

Il insère l'entité dans la base de données, puis met à jour certaines des colonnes de la base de données puis retourne l'identité. Tout est assez simple.

public int InsertRecord (RecEntity recEntity) { context.AddObject ("RecEntities", recEntity);

 context.SaveChanges(); 

     return recEntity.Id; 
    } 

L'insertion de la méthode fonctionne bien. Ensuite, j'ai besoin de mettre à jour l'entité actuelle avec les valeurs que la procédure stockée insérée. J'ai méthode dans mon référentiel pour récupérer des données

publique RecEntity SingleRecEntity (Expression> où) { retour context.RecEntities.Single (où); } Lorsque j'appelle cette méthode, les valeurs de valeurs insérées par la procédure stockée ne viennent pas à l'entité.

id = repository.InsertRecord (recEnntity); recEntity = repository.SingleBrokerPreRegistration (x => x.Id == id); // les nouvelles valeurs ne sont pas venues ici de la base de données

Je lance la requête générée par le framework d'entité dans l'analyseur de requêtes, il retourne toutes les valeurs à jour. Mais pour une raison quelconque, datacontext ne veut pas mettre à jour cette entité.

Probablement il devrait y avoir quelques façons de changer cela. Peut être quelqu'un peut expliquer ce comportement. Besoin d'aide.

Répondre

3

Essayez la méthode Refresh avec le paramètre StoreWins.
EF ne rafraîchit pas les valeurs dans le cas où il existe déjà un objet attaché avec l'entité clé spécifiée sauf si la méthode d'actualisation ne soit pas appelé explicitement

0

Si vous exécutez .Load(Objects.MergeOption.OverwriteChanges) sur la collection, vous aurez tous les éléments nouvellement ajoutés. Si vous voulez que les éléments supprimés pour être « rafraîchi » vous aurez besoin de détacher les entités de la collection avant d'exécuter .Load

Mettre le tout ensemble (désolé vb)

For Each child in Parent.ChildCollection.ToArray() 
    context.Detatch(child) 
Next 
Parent.ChildCollection.Load(Objects.MergeOption.OverwriteChanges) 

Cela fonctionne pour moi mais s'il y a une façon plus élégante, j'aimerais le voir!

Questions connexes