2012-02-07 2 views
0

Je l'insertion d'une nouvelle ligne à la table de base de données en utilisant Entity Framework, mais mon problème est que la colonne ValidFromDate provoque une exceptionEn utilisant Entity Framework pour insérer une ligne à une table qui a une clé composite

La propriété « ValidFromDate » fait partie des informations clés et ne peut pas être la date de modification

Notre base de données DBA a défini de l'objet et de l'image ci-dessous est l'instantané du fichier EDMX. ValidFromDate est une colonne datetime.

L'idée du FarmAnimal est de suivre l'histoire de l'endroit où certains animaux ont été. Par conséquent AnimalIdetValidFromDate provoque la ligne à être unique.

Maintenant, la question est de savoir comment puis-je insérer une nouvelle ligne à la table qui a ce genre de schéma?

EDMX

Insérer l'aide Entity Framework

var farmAnimal = new FarmAnimal { 
    AnimalId = insert.AnimalId, 
    ValidFromDate = insert.ValidFromDate // exception comes from this line, 
    etc. 
}; 
entities.FarmAnimals.Add(farmAnimal); 

Mise à jour: StackTrace

at System.Data.Objects.EntityEntry.DetectChangesInProperties(Boolean detectOnlyComplexProperties) 
    at System.Data.Objects.ObjectStateManager.DetectChangesInScalarAndComplexProperties(IList`1 entries) 
    at System.Data.Objects.ObjectStateManager.DetectChanges() 
    at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) 
    at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity) 
    at System.Data.Entity.DbSet`1.Add(TEntity entity) 
    at xxx.Repositories.PairingRepository.UpdateFarmAnimals(IEnumerable`1 updates, IEnumerable`1 inserts) in xxx 
    at xxx.Services.PairingService.RemovePairingAnimals(List`1 animalIds) in xxx 
    at xxx.Controllers.PairingController.RemovePairingAnimals(List`1 animalIds) in xxx 
    at lambda_method(Closure , ControllerBase , Object[]) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 

Mise à jour 2: Les fichiers Entity Framework

J'ai ajouté trois fichiers fichiers de mappage Entity Framework/générateurs EDMX fichier ADO.NET DbContext Générateur ADO.NET EntityObject Générateur (POCO de)

+0

À quel moment l'exception se produit-elle? L'un des setters, la méthode ObjectSet.Add, lorsque vous enregistrez les modifications? Pouvez-vous poster la trace de la pile? – cynic

+0

@cynic Voir le commentaire sur le bloc de code source. Je vais obtenir la trace de la pile maintenant. Merci pour votre temps. – Tx3

+0

Je vois que vous utilisez la couche wrapper DbSet/DbContext. Les entités POCO sont-elles ou sont-elles générées avec toute la logique de suivi des changements? – cynic

Répondre

1

L'enveloppe DbSet échoue avant même qu'il ne fasse quoi que ce soit avec votre nouveau FarmAnimal - DetectChanges est appelé avant AddObject sur le ObjectContext sous-jacent, et il détecte en quelque sorte les changements interdits dans un FarmAnimal déjà chargé/ajouté au contexte. Si vous utilisez des POCO avec des proxies ou simplement des classes ennuyeuses générées avec le suivi des modifications (ce n'est pas la même chose que les entités auto-surveillantes, seules les classes générées lorsque vous ajoutez un nouveau modèle de données avec VS2010) turn off automatic detection of changes afin qu'il ne soit pas appelé.

+0

J'ai fait mes premiers tests sur votre solution. Cela semble fonctionner, je vais juste tester un peu plus et ensuite marquer cela comme la réponse. Merci! – Tx3

+0

Fonctionne en douceur après avoir effectué des réglages similaires à ceux du lien fourni (chapitre "Désactivation de la détection automatique des modifications"). Après 20 heures, je peux attribuer la prime. Merci de votre aide. – Tx3

0

Je suis surpris qu'il ne tombe pas en panne plus tôt, car AnimalId et ValidFromDate sont tous les deux PrimaryKeys, AnimalId imo ne devrait jamais être défini dans votre code mais devrait être un compteur automatique.

après la recherche « La propriété fait partie des informations clés de l'objet et ne peut pas être la date de modification » Je suis arrivé ce succès: http://forums.asp.net/t/1747622.aspx/1

qui sans doute l'expliquer mieux que je ne le fera jamais

+0

Rappelez-vous que ce n'est pas une table Animal, donc AnimalId lui-même n'est pas unique, mais une combinaison de AnimalId et ValidFromDate. Dans la table des animaux, il y a un compteur automatique pour AnimalId. – Tx3

+0

Je ne comprends toujours pas pourquoi ils sont tous les deux PrimaryKeys. Ma conjecture est que EF ne vous permet pas de définir un DateTime comme une clé primaire, car il ne peut jamais être sûr du fait qu'il est unique. –

Questions connexes