Acumatica PXGraph.CreateInstance бросает ошибку - PullRequest
0 голосов
/ 21 октября 2018

У меня есть свой собственный класс PXGraph для моей собственной таблицы, который при создании CreateInstance () выдает ошибку.Ошибка «System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта».По какой-то причине этого также не происходит в моей среде разработки - только в производственной среде после развертывания.

Стек вызовов:

   at PX.Data.PXSelectorAttribute.populateFields(PXCache sender, Boolean bypassInit)
   at PX.Data.PXSelectorAttribute.CacheAttached(PXCache sender)
   at PX.Data.PXEventSubscriberAttribute.InvokeCacheAttached(PXCache cache)
   at PX.Data.PXCache`1..ctor(PXGraph graph)
   at PX.Data.PXCacheCollection.get_Item(Type key)
   at PX.Data.PXView.get_Cache()
   at PX.Data.PXRestrictorAttribute.AlterCommand(PXCache sender)
   at PX.Data.PXRestrictorAttribute.CacheAttached(PXCache sender)
   at PX.Data.PXAggregateAttribute.CacheAttached(PXCache sender)
   at PX.TM.PXOwnerSelectorAttribute.CacheAttached(PXCache sender)
   at PX.Data.PXEventSubscriberAttribute.InvokeCacheAttached(PXCache cache)
   at PX.Data.PXCache`1..ctor(PXGraph graph)
   at PX.Data.PXCacheCollection.get_Item(Type key)
   at PX.Data.PXView..ctor(PXGraph graph, Boolean isReadOnly, BqlCommand select)
   at PX.Data.PXSelect`2..ctor(PXGraph graph)
   at _Initialize(PXGraph )
   at PX.Data.PXGraph._InitializeDelegate.Invoke(PXGraph graph)
   at PX.Data.PXGraph..ctor()
   at PX.Data.PXGraph`1..ctor()
   at Aktion.Acumatica.RoyalBay.Customizations.SubscribeTRGData.Graphs.AKTRGItemClassMapMaint..ctor()
   at PX.Data.PXGraph.CreateInstance(Type graphType, String prefix)
   at PX.Data.PXGraph.CreateInstance(Type graphType)
   at PX.Data.PXGraph.CreateInstance[Graph]()

Класс графика:

 public class AKTRGItemClassMapMaint : PXGraph<AKTRGItemClassMapMaint>
    {
        public PXSelect<AKTRGItemClassMap,
            Where<AKTRGItemClassMap.trgItemClassCD, Equal<Required<AKTRGItemClassMap.trgItemClassCD>>>> TRGItemClassMaps;

        public PXSelect<INSetup> Settings;

        public PXSelect<INItemClass,
            Where<INItemClass.itemClassID, Equal<Required<INItemClass.itemClassID>>>> ClassItems;
    }

Вызов CreateInstance:

var classMapGraph = PXGraph.CreateInstance<AKTRGItemClassMapMaint>();

Структура таблицы:

CREATE TABLE [dbo].[AKTRGItemClassMap](
    [CompanyID] [int] NOT NULL,
    [ItemClassID] [int] NOT NULL,
    [ItemClassCD] [nvarchar](30) NOT NULL,
    [TRGItemClassCD] [nvarchar](30) NOT NULL,
 CONSTRAINT [PK_EEdiDocType] PRIMARY KEY CLUSTERED 
(
    [CompanyID] ASC,
    [ItemClassID] ASC,
    [TRGItemClassCD] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

И класс DAC:

[System.SerializableAttribute()]
public class AKTRGItemClassMap : PX.Data.IBqlTable
{
    public abstract class itemClassID : IBqlField { }

    [PXDBInt]
    public virtual int? ItemClassID { get; set; }

    public abstract class itemClassCD : IBqlField { }

    [PXDBString(30, IsUnicode = true)]
    public virtual string ItemClassCD { get; set; }

    public abstract class trgItemClassCD : IBqlField { }

    [PXDBString(30, IsUnicode = true)]
    public virtual string TRGItemClassCD { get; set; }
}

Есть идеи?

1 Ответ

0 голосов
/ 14 августа 2019

Решение моей проблемы - обернуть создание и использование любого экземпляра графа чем-то вроде этого с помощью PXLoginScope, чтобы дать ему контекст для входа в систему.

using (var pxLoginScope = new PXLoginScope(userName, new string[0]))
{
    var membershipUser = Membership.GetUser(pxLoginScope.UserName);

    if (membershipUser != null)
    {
        pxLoginScope.UserName = membershipUser.UserName;
        userName = PXContext.PXIdentity.User.Identity.Name;

        if (pxLoginScope.CompanyName != null)
        {
            string[] rolesForUser = System.Web.Security.Roles.GetRolesForUser(pxLoginScope.UserName);
            if (rolesForUser == null || rolesForUser.Length == 0)
                throw new PXException("You are not allowed to login to the company {0}.", new object[1]
                    {
                        (object) pxLoginScope.CompanyName
                    });
            else if (!Enumerable.Contains<string>((IEnumerable<string>)PXDatabase.AvailableCompanies,
                pxLoginScope.CompanyName))
                throw new PXException("You are not allowed to login to the company {0}.", new object[1]
                    {
                        (object) pxLoginScope.CompanyName
                   });
        }

        PXLogin.SetBranchID(pxLoginScope.UserName, pxLoginScope.CompanyName, pxLoginScope.Branch);

        <graph creation and usage goes here>
    }
}
...