Out of the box, InforCRM contacts are only able to be created with the InsertContactAccount.aspx page (to promote duplicate-record intervention). I also found that you can create contacts with the Xbar Outlook plugin. I have a test (ON PREM) environment that was able to create contacts until recently.
Both the web client and the Xbar plugin now display error message "The address EntityId must be defined". I don't believe there were any major changes since.
Based on the Event Viewer warnings, it looks like the issue has something to do with the OOB class/dlls, business rules, the DynamicMethods.xml, or something else.
At this point, I've tinkered and prodded aimlessly at different things. Any pointers would be helpful. Thanks!
Warning 1
2021-01-25 15:28:33,446 [55] WARN SlxClient.InsertContactAccountPage - Saleslogix Web Client unhandled exception during async postback [Saleslogix Error Id=SLXA6910ED63B491574]
{
"slxErrorId": "SLXA6910ED63B491574",
"mitigation": "AjaxValidationResponse (578)",
"date": "2021-01-25T15:28:33",
"utc": "2021-01-25T21:28:33",
"message": "The address EntityId must be defined.",
"source": "Sage.SalesLogix.Address.Rules, Sage.SalesLogix.BusinessRules, Version=8.4.0.3463, Culture=neutral, PublicKeyToken=null",
"type": "Sage.Platform.Application.ValidationException",
"stackTrace": " at Sage.SalesLogix.Address.Rules.OnBeforeInsert(IAddress address, ISession session)
at (Object )
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)",
"targetSite": "Boolean OnBeforeInsert(Sage.Entity.Interfaces.IAddress, NHibernate.ISession)",
"fullException": "Sage.Platform.DynamicMethod.DynamicMethodException: An exception occurred executing the dynamic method Contact.SaveContactAccount. ---> Sage.Platform.DynamicMethod.DynamicMethodException: An exception occurred executing the dynamic method Address.OnBeforeInsert. ---> Sage.Platform.Application.ValidationException: The address EntityId must be defined
at Sage.SalesLogix.Address.Rules.OnBeforeInsert(IAddress address, ISession session)
at (Object )
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)
--- End of inner exception stack trace ---
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)
at Sage.SalesLogix.Entities.Address.NHibernate.Classic.ILifecycle.OnSave(ISession s) in c:\Users\vmadmin\AppData\Roaming\Sage\Platform\Output\implementation\Address.cs:line 1286
at NHibernate.Event.Default.AbstractSaveEventListener.InvokeSaveLifecycle(Object entity, IEntityPersister persister, IEventSource source)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)
at NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave(IEventSource source, IEntityPersister persister, Object entity, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)
at NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollectionElements(Object parent, Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollection(Object parent, Object child, CascadeStyle style, Object anything, CollectionType type)
at NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.CascadeAfterSave(IEventSource source, IEntityPersister persister, Object entity, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)
at Sage.SalesLogix.Entities.Account.Save() in c:\Users\vmadmin\AppData\Roaming\Sage\Platform\Output\implementation\Account.cs:line 3734
at Sage.SalesLogix.Entities.Account.Sage.Platform.Orm.Interfaces.IPersistentEntity.Save() in c:\Users\vmadmin\AppData\Roaming\Sage\Platform\Output\implementation\Account.cs:line 3851
at Sage.SalesLogix.Contact.Rules.SaveContactAccount(IContact contact, IAccount account, String& result)
at (Object )
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)
--- End of inner exception stack trace ---
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)
at Sage.SalesLogix.Entities.Contact.SaveContactAccount(IAccount account) in c:\Users\vmadmin\AppData\Roaming\Sage\Platform\Output\implementation\Contact.cs:line 4124
at ASP.InsertContact.SaveContact()
at ASP.InsertContact.cmdSave_ClickAction(Object sender, EventArgs e)
at System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e)
at System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)",
"hashCode": "1CC934FE-FE639434-B6F5381D",
"pid": 6228,
"identity": {
"name": "admin",
"isAuthenticated": true,
"authenticationType": "Forms"
},
Warning 2
2021-01-25 15:28:33,446 [55] ERROR Sage.Platform.DynamicMethod.DynamicMethodLibrary - An error occurred executing a dynamic method
{
"slxErrorId": "SLXD29A29395ABCA277",
"mitigation": "AjaxValidationResponse (578)",
"date": "2021-01-25T15:28:33",
"utc": "2021-01-25T21:28:33",
"message": "The address EntityId must be defined.",
"source": "Sage.SalesLogix.Address.Rules, Sage.SalesLogix.BusinessRules, Version=8.4.0.3463, Culture=neutral, PublicKeyToken=null",
"type": "Sage.Platform.Application.ValidationException",
"stackTrace": " at Sage.SalesLogix.Address.Rules.OnBeforeInsert(IAddress address, ISession session)
at (Object )
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)",
"targetSite": "Boolean OnBeforeInsert(Sage.Entity.Interfaces.IAddress, NHibernate.ISession)",
"fullException": "Sage.Platform.DynamicMethod.DynamicMethodException: An exception occurred executing the dynamic method Address.OnBeforeInsert. ---> Sage.Platform.Application.ValidationException: The address EntityId must be defined
at Sage.SalesLogix.Address.Rules.OnBeforeInsert(IAddress address, ISession session)
at (Object )
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)
--- End of inner exception stack trace ---
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)
at Sage.SalesLogix.Entities.Address.NHibernate.Classic.ILifecycle.OnSave(ISession s) in c:\Users\vmadmin\AppData\Roaming\Sage\Platform\Output\implementation\Address.cs:line 1286
at NHibernate.Event.Default.AbstractSaveEventListener.InvokeSaveLifecycle(Object entity, IEntityPersister persister, IEventSource source)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)
at NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave(IEventSource source, IEntityPersister persister, Object entity, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)
at NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollectionElements(Object parent, Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollection(Object parent, Object child, CascadeStyle style, Object anything, CollectionType type)
at NHibernate.Engine.Cascade.CascadeAssociation(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object parent, Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.CascadeAfterSave(IEventSource source, IEntityPersister persister, Object entity, Object anything)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)
at Sage.SalesLogix.Entities.Account.Save() in c:\Users\vmadmin\AppData\Roaming\Sage\Platform\Output\implementation\Account.cs:line 3734
at Sage.SalesLogix.Entities.Account.Sage.Platform.Orm.Interfaces.IPersistentEntity.Save() in c:\Users\vmadmin\AppData\Roaming\Sage\Platform\Output\implementation\Account.cs:line 3851
at Sage.SalesLogix.Contact.Rules.SaveContactAccount(IContact contact, IAccount account, String& result)
at (Object )
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)",
"hashCode": "1CC934FE-7BD17956-07033356",
"pid": 6228,
"identity": {
"name": "admin",
"isAuthenticated": true,
"authenticationType": "Forms"
},
Warning 3
2021-01-25 15:28:33,431 [55] ERROR Sage.Platform.DynamicMethod.DynamicMethodLibrary - An error occurred executing a dynamic method
{
"slxErrorId": "SLX647F887C045F9ECC",
"mitigation": "AjaxValidationResponse (578)",
"date": "2021-01-25T15:28:33",
"utc": "2021-01-25T21:28:33",
"message": "The address EntityId must be defined.",
"source": "Sage.SalesLogix.Address.Rules, Sage.SalesLogix.BusinessRules, Version=8.4.0.3463, Culture=neutral, PublicKeyToken=null",
"type": "Sage.Platform.Application.ValidationException",
"stackTrace": " at Sage.SalesLogix.Address.Rules.OnBeforeInsert(IAddress address, ISession session)
at (Object )
at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)",
"targetSite": "Boolean OnBeforeInsert(Sage.Entity.Interfaces.IAddress, NHibernate.ISession)",
"hashCode": "1E3125B7-C73C36AB-E5CAAA97",
"pid": 6228,
"identity": {
"name": "admin",
"isAuthenticated": true,
"authenticationType": "Forms"
},
"version": "8.4.0.3463",
"logger": {
"level": "ERROR",
"location": "Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(:0)",
"name": "Sage.Platform.DynamicMethod.DynamicMethodLibrary",
"message": "An error occurred executing a dynamic method"
},