2011-08-23 17 views
3

は、私が実装する必要があるビジネスロジックです:ObjectStateManagerChangedハンドラ内のエンティティオブジェクトを変更することはできますか?ここ

データモデル内の複数のエンティティタイプ、例えばがあります:ユーザー、のUserProfile、UserProfileValue、UserExtendedDataなど

は、ユーザーのようないくつかのエンティティを作成するとき、私は自動を必要としますUserProfileなどの論理的にリンクされた他のエンティティを作成します(通常はdbで1:1の関係)。

各エンティティには、OnCreating/OnCreated、OnUpdating/OnUpdatedメソッドを持つコントローラがあり、これはmy datacontextクラスのオーバーライドされたSaveChangesメソッドから呼び出されます。

​​

私は私のUser.OnCreating()方法で自動作成を実施した場合、最終的に何OnCreating()コントローラは、コレクションaddedEntitiesが新しいエントリで更新されていないため、すべての自動作成された子実体のために呼び出されません。

私のアイデアの一つは、データコンテキストのObjectStateManagerChanged

private void ObjectStateManagerObjectStateManagerChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e) 
{ 
    if (e.Action == CollectionChangeAction.Add) 
    { 
     var state = ObjectStateManager.GetObjectStateEntry(e.Element).State; 
     if (state == EntityState.Added) 
     { 
      //should call on creating handlers 
      if (e.Element is User) 
      { 
       User user = (User)e.Element; 
       user.UserProfile = UserProfile.CreateDefaultProfile(); 
      } 
     } 
    } 
} 

を扱うしかし、私はこのようにそれを行う場合は、残念ながら私はNullReferrence例外を取得していますによって依存エンティティの自動作成を実行することです。 ObjectStateManagerObjectStateManagerChanged内のユーザーのプロパティを変更しようとしても例外が表示されます。

必要な機能を実装する方法についてのご意見やご提案はありますか?

EDIT:

null参照私が取得しています:新しいUserオブジェクトがコンテキストに追加された場合

System.NullReferenceException was unhandled by user code 
    Message=Object reference not set to an instance of an object. 
    Source=System.Data.Entity 
    StackTrace: 
     at System.Data.Objects.ObjectContext.AddSingleObject(EntitySet entitySet, IEntityWrapper wrappedEntity, String argumentName) 
     at System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity) 
     at Edm.Entity.Entities.AddObject(Object entity) 

そしてEdm.Entity.Entities.AddObject(Object entity)です。

EDIT2: ない次の例外をスローし始め、上記のように、私が変更したが、同じコードを確認してください。

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <code></code> 
    <message xml:lang="en-US">An error occurred while processing this request.</message> 
    <innererror> 
    <message>Object reference not set to an instance of an object.</message> 
    <type>System.NullReferenceException</type> 
    <stacktrace> at System.Data.Objects.DataClasses.EntityReference`1.Exclude()&#xD; 
    at System.Data.Objects.DataClasses.RelationshipManager.RemoveRelatedEntitiesFromObjectStateManager(IEntityWrapper wrappedEntity)&#xD; 
    at System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity)&#xD; 
    at System.Data.Services.Providers.ObjectContextServiceProvider.CreateResource(String containerName, String fullTypeName)&#xD; 
    at System.Data.Services.UpdatableWrapper.CreateResource(String containerName, String fullTypeName)&#xD; 
    at System.Data.Services.Serializers.SyndicationDeserializer.CreateObject(SegmentInfo segmentInfo, Boolean topLevel, SyndicationItem item)&#xD; 
    at System.Data.Services.Serializers.SyndicationDeserializer.CreateSingleObject(SegmentInfo segmentInfo)&#xD; 
    at System.Data.Services.Serializers.Deserializer.ReadEntity(RequestDescription requestDescription)&#xD; 
    at System.Data.Services.Serializers.Deserializer.HandlePostRequest(RequestDescription requestDescription)&#xD; 
    at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)&#xD; 
    at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD; 
    at System.Data.Services.DataService`1.BatchDataService.HandleBatchContent(Stream responseStream)</stacktrace> 
    </innererror> 
</error> 
+0

ここで、NullReferrence例外を取得しますか? – Eranga

+0

上記の私の編集をご覧ください。 – Paul

答えて

2

私は正確に同じ問題を持っています。 ObjectStateManagerChangedイベント中に別のEntityObjectを追加すると問題になるようです。奇妙なことは、私のコード(とあなたのコードもおそらく)が.net 3.5で正常に動作していることですが、4.0ではNullReferenceExceptionが発生します。

私は.NETフレームワークをデバッグし、ObjectStateManagerChangedイベントを呼び出した後、内部ObjectContext.AddSingleObjectメソッドでクラッシュしたことを認識しました。この例外は、内部のProcessedEntitiesハッシュセットがパブリックAddObjectメソッドの最後でnullになるために発生します。しかし、ObjectStateManagerChangedイベント中にEntityObjectが作成された場合、このハッシュセットをnullにするべきではありません。

これは.NET Framework 4.0バグのようです。

関連する問題