2013-06-16 13 views
10

Prendendo il mio primo babyste con Entity Framework 5.0, mi imbatto in un'eccezione con la prima Entity I .NullReferenceException in DbContext.saveChanges()

Si prega di notare che ogni tabella creata dopo che funziona bene. Inoltre, tieni presente che ho eseguito le normali operazioni di rigenerazione del database e/o di riavvio dell'IDE di Visual Studio.

Utilizzando Model-First, ho creato una tabella banale denominata Contacts, definita come

<EntityType Name="Contacts"> 
    <Key> 
     <PropertyRef Name="ContactID" /> 
    </Key> 
    <Property Name="ContactID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" /> 
    <Property Name="Name" Type="nvarchar(max)" Nullable="false" /> 
    </EntityType> 

poi ho cercato di eseguire il codice riportato di seguito (dal Page Load di una pagina ASP.NET)

  var contact = new DataContext.Contact { Name = aName }; 

      context.Contacts.Add(contact); 
      context.SaveChanges(); 

eccezione (con aName! = null):

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.ParseChildrenAttribute.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.AttributeProvider.GetAttributes(Type type) 
     at System.Data.Entity.ModelConfiguration.Utilities.AttributeProvider.GetAttributes(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(String 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: 

Qualcuno può spiegare la causa di questa eccezione? Soprattutto, che cosa fa quella chiamata a ParseChildrenAttribute.GetHashCode?

Ho trovato qualcuno che si è imbattuto nello stesso numero here, ma non è stata fornita una spiegazione soddisfacente.

+0

Non è 'aName' null per caso? –

+0

No. Ho controllato. Ancora più importante, ciò comporterebbe un'eccezione completamente diversa. –

+0

Inizializza ContactID 'var contact = new DataContext.Contact {Name = aName, ContactID = 0};' e vedere se il problema persiste –

risposta

5

Problema risolto.

La causa era un po 'sciocca. Stavo usando il progetto predefinito ASP.NET Web Forms Application da VS Web Express per eseguire i miei test. Questo progetto contiene un modulo Web chiamato Contact.aspx, , quindi include già un contatto di classe parziale nello stesso spazio dei nomi della mia entità contatto.

Comprensibilmente, questo non ha funzionato bene con Entity Framework, portando all'errore piuttosto oscuro sopra. L'eliminazione della pagina di aspx ha risolto il problema.

+3

Ho avuto lo stesso problema e ho perso due ore per capire. Grazie. la tua risposta è stata molto utile. –

6

Questo accade quando si crea una pagina Web ASP.NET con lo stesso nome di una tabella nel database, dopo aver generato le classi edmx ed EF dal proprio database Visual Studio le inserirà nello spazio dei nomi predefinito per il progetto che provoca un conflitto con la classe parziale generato dei file di pagine web .aspx.cs

non c'è bisogno di rimuovere o rinominare il file aspx della tua pagina web basta cambiare il nome della classe pubblica parziale dichiarato in le code code behind (myPage.aspx.cs) e regolano opportunamente la proprietà Inherits della pagina.

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

In alternativa è sempre possibile dichiarare le pagine Web in uno spazio dei nomi diverso.

Problemi correlati