Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在ObjectStateManagerChanged处理程序中修改实体对象?_C#_.net_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 是否可以在ObjectStateManagerChanged处理程序中修改实体对象?

C# 是否可以在ObjectStateManagerChanged处理程序中修改实体对象?,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,以下是我需要实现的业务逻辑: 数据模型中有多种实体类型,如:用户、UserProfile、UserProfileValue、UserExtendedData等 当创建一些实体(如User)时,我需要自动创建其他逻辑链接的实体(通常在db中具有1:1关系),例如UserProfile 每个实体都有一个控制器,其中包含OnCreating/OnCreated、onupdate/OnUpdated方法,这些方法是从我的datacontext类的重写SaveChanges方法调用的 public ove

以下是我需要实现的业务逻辑:

数据模型中有多种实体类型,如:用户、UserProfile、UserProfileValue、UserExtendedData等

当创建一些实体(如User)时,我需要自动创建其他逻辑链接的实体(通常在db中具有1:1关系),例如UserProfile

每个实体都有一个控制器,其中包含OnCreating/OnCreated、onupdate/OnUpdated方法,这些方法是从我的datacontext类的重写SaveChanges方法调用的

public override int SaveChanges(SaveOptions options)
{
    IEnumerable<ObjectStateEntry> addedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Added);
    IEnumerable<ObjectStateEntry> changedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
    IEnumerable<ObjectStateEntry> deletedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Deleted);

    InvokeSavingControllers(addedEntities, changedEntities, deletedEntities);

    //some other code

    int rowsAffected = base.SaveChanges(options);

    InvokeSavedControllers(addedEntities, changedEntities, deletedEntities);

    return rowsAffected;
}
但不幸的是,如果我这样做的话,我会得到nullreference异常。即使我试图在
ObjectStateManagerObjectStateManagerChanged
中修改用户的属性,我也会遇到异常

关于如何实现所需功能有什么想法或建议吗

编辑:

我得到的空引用:

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)
是将新的
User
对象添加到上下文中的地方

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>

我有完全相同的问题。在ObjectStateManagerChanged事件期间添加另一个EntityObject似乎有问题。奇怪的是,我的代码(可能还有你的代码)在.NET3.5中运行良好,但在4.0中给出了一个NullReferenceException

我调试了.net framework,发现它在调用ObjectStateManagerChanged事件后在内部ObjectContext.AddSingleObject方法中崩溃。发生此异常是因为内部ProcessedEntities哈希集在public AddObject方法的结尾处变为null。但是,如果EntityObject是在ObjectStateManagerChanged事件期间创建的,则此哈希集不应设为null


这似乎是一个.net framework 4.0错误。

从哪里获得“NullReference异常”?
<?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>