NullReferenceException dans DbContext.saveChanges ()

Prenant mes tout premiers pas avec Entity Framework 5.0, je rencontre une exception avec la toute première entité que je crée .

Veuillez noter que chaque table créée après cela fonctionne très bien. Notez également que j’ai pris les mesures habituelles de régénération de la firebase database et / ou de redémarrage de l’IDE de Visual Studio.

À l’aide de Model-First, j’ai créé un tableau sortingvial appelé Contacts , défini comme

         

J’ai ensuite essayé d’exécuter le code suivant (à partir du Page_Load d’une page ASP.NET)

  var contact = new DataContext.Contact { Name = aName }; context.Contacts.Add(contact); context.SaveChanges(); 

(avec aName! = null)

Exception:

 System.NullReferenceException was unhandled by user code HResult=-2147467261 Message=Object reference not set to an instance of an object. Source=System.Web StackTrace: at System.Web.UI.ParseChildrenAtsortingbute.GetHashCode() at System.Collections.Generic.ObjectEqualityComparer`1.GetHashCode(T obj) at System.Collections.Generic.HashSet`1.InternalGetHashCode(T item) at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value) at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other) at System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection, IEqualityComparer`1 comparer) at System.Collections.Generic.HashSet`1..ctor(IEnumerable`1 collection) at System.Data.Entity.ModelConfiguration.Utilities.AtsortingbuteProvider.GetAtsortingbutes(Type type) at System.Data.Entity.ModelConfiguration.Utilities.AtsortingbuteProvider.GetAtsortingbutes(PropertyInfo propertyInfo) at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildPropertyValidator(PropertyInfo clrProperty) at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildValidatorsForProperties(IEnumerable`1 clrProperties, IEnumerable`1 edmProperties, IEnumerable`1 navigationProperties) at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildTypeValidator[T](Type clrType, IEnumerable`1 edmProperties, IEnumerable`1 navigationProperties, Func`3 validatorFactoryFunc) at System.Data.Entity.Internal.Validation.EntityValidatorBuilder.BuildEntityValidator(InternalEntityEntry entityEntry) at System.Data.Entity.Internal.Validation.ValidationProvider.GetEntityValidator(InternalEntityEntry entityEntry) at System.Data.Entity.Internal.InternalEntityEntry.GetValidationResult(IDictionary`2 items) at System.Data.Entity.DbContext.ValidateEntity(DbEntityEntry entityEntry, IDictionary`2 items) at System.Data.Entity.DbContext.GetValidationErrors() at System.Data.Entity.Internal.InternalContext.SaveChanges() at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() at System.Data.Entity.DbContext.SaveChanges() at Contactisch._Default.AddContact(Ssortingng aName) in c:\Projects\Contactisch\Contactisch\Contactisch\Default.aspx.cs:line 32 at Contactisch._Default.Page_Load(Object sender, EventArgs e) in c:\Projects\Contactisch\Contactisch\Contactisch\Default.aspx.cs:line 14 at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) InnerException: 

Quelqu’un peut-il expliquer la cause de cette exception? En particulier, que fait cet appel à ParseChildrenAtsortingbute.GetHashCode?

J’ai trouvé quelqu’un qui rencontre le même problème ici , mais aucune explication satisfaisante n’a été donnée.

Cela se produit lorsque vous créez une page Web ASP.NET avec le même nom qu’une table dans votre firebase database, après avoir généré vos classes edmx et EF à partir de votre firebase database, Visual Studio les place dans l’espace de noms par défaut de votre projet, ce qui provoque un conflit avec l’élément généré. classe partielle du fichier .aspx.cs des pages Web

Vous n’avez pas besoin de supprimer ou de renommer le fichier .aspx de votre page Web, il vous suffit de modifier le nom de la classe publique partielle déclarée dans le code de pages situé derrière (myPage.aspx.cs) et d’ajuster correctement la propriété Inherits de la page.

 <%@Page Title="MyPage" ... Inherts="namespace.newClassName" > 

Sinon, vous pouvez toujours déclarer vos pages Web sous un espace de noms différent.

Problème résolu.

La cause était un peu bête. J’utilisais le projet d’ ASP.NET Web Forms Application par défaut de VS Web Express pour effectuer mes tests. Ce projet contient un formulaire Web appelé Contact.aspx . Il inclut donc déjà une classe partielle Contact dans le même espace de nom que mon entité Contact .

Naturellement, cela n’a pas bien fonctionné avec Entity Framework, conduisant à l’erreur plutôt obscure ci-dessus. La suppression de la page aspx a résolu le problème.