は、私が実装する必要があるビジネスロジックです: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()
at System.Data.Objects.DataClasses.RelationshipManager.RemoveRelatedEntitiesFromObjectStateManager(IEntityWrapper wrappedEntity)
at System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity)
at System.Data.Services.Providers.ObjectContextServiceProvider.CreateResource(String containerName, String fullTypeName)
at System.Data.Services.UpdatableWrapper.CreateResource(String containerName, String fullTypeName)
at System.Data.Services.Serializers.SyndicationDeserializer.CreateObject(SegmentInfo segmentInfo, Boolean topLevel, SyndicationItem item)
at System.Data.Services.Serializers.SyndicationDeserializer.CreateSingleObject(SegmentInfo segmentInfo)
at System.Data.Services.Serializers.Deserializer.ReadEntity(RequestDescription requestDescription)
at System.Data.Services.Serializers.Deserializer.HandlePostRequest(RequestDescription requestDescription)
at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.BatchDataService.HandleBatchContent(Stream responseStream)</stacktrace>
</innererror>
</error>
ここで、NullReferrence例外を取得しますか? – Eranga
上記の私の編集をご覧ください。 – Paul