Mise à jour à l'Exception de l'Entité Cadre?
Salut,
Je suis en utilisant EntityFramework pour mon ASP.NET MVC site web, mais certains ont des problèmes avec la mise à jour.
C'est comment mon code de mise à jour looka comme :
using (BissEntities context = new BissEntities())
{
if (adCategoryFilter.Id < 1)
context.AddToAdCategoryFilter(adCategoryFilter);
else
context.Refresh(System.Data.Objects.RefreshMode.ClientWins, adCategoryFilter);
if (context.SaveChanges() > 0)
return true;
}
return false;
Lors de l'exécution du contexte.Actualiser j'obtiens l'exception suivante :
L'élément à l'indice 0 dans la collection d'objets d'actualisation est nulle EntityKey la valeur de la propriété ou n'est pas attaché à cette Vousmanager.
Stacktrace : at System.Data.Objects.ObjectContext.RefreshCheck(Dictionary`2 entities, Object entity, EntityKey key)
at System.Data.Objects.ObjectContext.AddRefreshKey(Object entityLike, Dictionary`2 entities, Dictionary`2 currentKeys)
at System.Data.Objects.ObjectContext.RefreshEntities(RefreshMode refreshMode, IEnumerable collection)
at System.Data.Objects.ObjectContext.Refresh(RefreshMode refreshMode, Object entity)
at Biss.Models.FilterModel.UpdateCategoryFilter(AdCategoryFilter adCategoryFilter) in C:\Users\Snowman\Documents\Visual Studio 2010\Projects\Biss\Biss\Models\FilterModel.cs:line 86
Ce n'est pas la première fois que j'ai ce problème. J'ai d'abord pensé qu'il pourrait avoir à faire avec les relations dans la base de données mais après ces a été retiré de l'effectuées table de la même exception est resté.
D'où vient le adCategoryFilter venir?
La adCategoryFilter est instansiated(nouveau), puis rempli avec les données de la ViewObject(du site web). Il possède les données nécessaires comme filtre Id (à la carte le filtre de ligne correcte en db).
Moyens expliquer pourquoi je suis de ce problème et comment je pourrais le résoudre.
BestRegards
OriginalL'auteur Banshee | 2010-12-13
Vous devez vous connecter pour publier un commentaire.
Parce que votre aide ASP.NET MVC, votre travail dans un apatrides de l'environnement. Cela signifie que, une fois qu'une demande a terminé le traitement, il n'y a pas plus de "Entité Cadre de la Mémoire", ou "Graphe".
Donc, vous devez indiquer explicitement EF vous souhaitez ajouter ou mettre à jour.
Voici comment vous le faites:
Qui est appelé le stub technique.
En bref, vous créez une nouvelle entité avec la même entité clé que l'entité que vous essayez de mettre à JOUR (dans votre cas, l'entité clé est "Id").
Vous puis "joindre" ce stub (de sorte qu'il est traqué par l'EF graphique interne), puis remplacer les valeurs sur ce talon avec votre entité pour mettre à JOUR, puis sur enregistrer les changements.
Je ne peux pas utiliser UpdateModel, comme j'ai un multi-couches de l'architecture et de l'utilisation POCO, personnalisé viewmodel, etc - j'ai donc créé une coutume "UpdateModel" la méthode sur mon service/référentiel - qui n'a (plus compliqué) version de la ci-dessus.
Aussi essayez de ne pas utiliser "si l'Id < 1, c'est un complément" avec ASP.NET MVC - comme si vous oubliez de lier le numéro de la vue, elle est passée à 0, de sorte que même si vous pourriez faire un mise à jour, votre code ci-dessus va essayer de le faire d'une ajouter.
Au lieu d'être plus explicite - ont séparé les méthodes d'action pour Ajouter/mettre à Jour.
HTH.
OriginalL'auteur RPM1984
Au lieu de rafraîchissant, essayez de récupérer l'objet et la mise à jour de ses propriétés en utilisant quelque chose comme une auto-mapper (ou UpdateModel MVC contrôleur)
La EntityKey est une chose distincte de la propriété id, avec quelques autres trucs se cache sous le capot. Votre objet nouvellement créé, est absent de ce genre de choses, qui est l'endroit où vient le problème.
Le modèle va un peu (pas de C# mec, donc s'il vous plaît excuser la syntaxe):
La différence essentielle est que le nouvel objet récupéré a la EntityKey tous ensemble correctement. Vous pouvez valablement utiliser l'id de propriété pour détecter une nouvelle/un objet existant, mais il ya plus à la EntityKey que juste que bien.
Pas sûr, je n'ai pas regardé l'intérieur de soit. Je pense qu'ils utilisent tous les deux la réflexion et sont assez semblables, en fait, je utiliser mon propre où j'marquer explicitement les propriétés d'être mis à jour dans les métadonnées. Ce que les deux méthodes n'est, fondamentalement, vous économiser de l'écriture origObject.Property = viewModel.Propriété pour chaque propriété - ce qui peut se faire, il serait tout aussi valable.
OriginalL'auteur RichardW1001