2013-06-16 30 views
10

Entity Framework 5.0で初めてのbabystepsを使用して、という非常に最初のEntityで例外が発生しました。を作成します。DbContext.saveChanges()内のNullReferenceException

その後作成されたすべてのテーブルはうまく動作します。また、データベースを再生成したり、Visual Studio IDEを再起動したりする通常の手順を実行しました。モデルファーストを用い

、私は些細なテーブルを作成し、私はその後、(ASP.NETページのをPage_Loadから)次のコードを実行しようとした

<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> 

として定義され、Contactsと呼ば

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

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

(!もし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: 

誰かがこの例外の原因を説明することはできますか?特に、ParseChildrenAttribute.GetHashCodeへの呼び出しは何ですか?

私は誰かが同じ問題に遭遇したのを見つけましたが、満足のいく説明はありませんでした。here

+0

'aName'は偶然ではありませんか? –

+0

いいえ。さらに重要なことは、それがまったく異なる例外につながることです。 –

+0

ContactIDを初期化するvar contact = new DataContext.Contact {Name = aName、ContactID = 0};そして問題が続くかどうかを確認する –

答えて

5

問題を解決しました。

原因は少し愚かでした。 VS Web ExpressのデフォルトASP.NET Web Forms Applicationプロジェクトを使用してテストを行っていました。このプロジェクトにはというContact.aspxというWebフォームが含まれていますので、すでにContact Contentと同じ名前空間に部分クラスContactが含まれています。

これはEntity Frameworkではうまく動作しませんでしたが、上記のあいまいなエラーにつながりました。 aspxページを削除すると問題は解決しました。

+3

私は同じ問題を抱えていて、理解するのに2時間を失いました。おかげさまで あなたの答えはとても役に立ちました。 –

6

データベースからedmxおよびEFクラスを生成した後、データベースのテーブルと同じ名前のASP.NET Webページを作成すると、Visual Studioによってそれらがプロジェクトのデフォルト名前空間に配置され、 Webページ.aspx.csファイルの生成された部分クラスとの競合が

あなただけがで宣言さ部分パブリッククラスの名前を変更する削除するか、Webページの.aspxのファイルの名前を変更する必要はありません。 (myPage.aspx.cs)の背後にあるコードは、ページのInheritsプロパティを適切に調整します。

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

また、別の名前空間でウェブページを宣言することもできます。

関連する問題