NullReferenceException при сохранении Entity
Добрый день. Возникла такая проблема. При попытки сохранения экземпляра мероприятия (Event) возникает следующее исключение:
System.NullReferenceException: Object reference not set to an instance of an object.
at Terrasoft.Core.ProcessEngine.GetProcessListeners(UserConnection userConnection, Entity entity, EntityChangeType changeType)
at Terrasoft.Configuration.BaseEntity_Base_Entity_TerrasoftEventsProcess`1.TryProcessComplete(EntityChangeType changeType)
at Terrasoft.Configuration.BaseEntity_Base_Entity_TerrasoftEventsProcess`1.BaseEntitySavingScriptTaskExecute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.Configuration.BaseEntity_Base_Entity_TerrasoftEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.Configuration.BaseEntityEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.Configuration.EventEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.Configuration.BaseEntity_Base_Entity_TerrasoftEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
at Terrasoft.Configuration.BaseEntity_Base_Entity_TerrasoftEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.Configuration.BaseEntityEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.Configuration.EventEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
at Terrasoft.Configuration.EventEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
at Terrasoft.Core.Entities.Entity.ThrowEvent(String message, EventArgs eventArgs)
at Terrasoft.Core.Entities.Entity.OnSaving(EntityBeforeEventArgs e)
at Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired, Boolean setColumnDefValue)
at Terrasoft.Core.Process.ZzzzRecalcTestProcessMethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)Код С#, в котором возникает исключение:
var eventEsq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Event");
var idFilter = eventEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "Id", eventId);
eventEsq.Filters.Add(idFilter);
var idColumn = eventEsq.AddColumn("Id").Name;
var responseColumn = eventEsq.AddColumn("SxActualResponse").Name;
var eventEntity = eventEsq.GetEntityCollection(userConnection).FirstOrDefault();
if (eventEntity == null)
throw new ArgumentException("Event с таким Id не существует в БД");
var contactsCountEsq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Contact");
var eventFilter = contactsCountEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "Event", eventId);
contactsCountEsq.Filters.Add(eventFilter);
var countFunction = contactsCountEsq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id");
var countColumn = contactsCountEsq.AddColumn(countFunction).Name;
var resultEntity = contactsCountEsq.GetEntityCollection(userConnection).FirstOrDefault();
var count = resultEntity.GetTypedColumnValue(countColumn);
eventEntity.SetColumnValue(responseColumn, count);
eventEntity.Save();Сталкивался кто-либо с подобной проблемой? Как её можно решить?
Нравится
Попробуйте в запрос "eventEsq" добавить все колонки функцией "AddAllSchemaColumns". Проблема может быть в том, что процессы которые выполняются при сохранении Entity обращаются к разным колонкам этой Entity, но они у вас не загружены и возникает исключение.
Добрый день!
Мне кажется Вам FirstOrDefault вернул Default, и там просто какой-то пустой объект Entity, у которого можно вызвать Save, но нет никаких колонок.
Колебянов Виталий Романович,
Да, проблема в этом была, похоже. После замены выбора конкретных полей на AddAllSchemaColumns - всё заработало.