To Define a Primary Key
You can define the primary key of a data access class (DAC) by using the
PrimaryKeyOf<Table>.By<keyFields> class. With
this class, you can define simple keys (with one key field) and compound keys (with
up to eight key fields) and select records by using these keys, as described in this
topic.
Note: A DAC can contain only one primary key declaration. If you want to
declare a key for another combination of DAC fields so that you can identify a
separate DAC row, instance, or entity, you can create a unique key. For details,
see To Define a Unique Key.
To Define a Simple Primary Key and Select a Record by Using This Key
- In the DAC, declare a
PrimaryKeyOf<Table>.By<keyFields>
descendant with the
public
Find method, which calls theprotected
FindBy method, as shown in the following code.using PX.Data.ReferentialIntegrity.Attributes; public partial class InventoryItem : PX.Data.PXBqlTable, PX.Data.IBqlTable { public class PK : PrimaryKeyOf<InventoryItem>.By<inventoryID> { public static InventoryItem Find(PXGraph graph, int? inventoryID) => FindBy(graph, inventoryID); } public abstract class inventoryID : PX.Data.BQL.BqlInt.Field<inventoryID> { } }
- Use the primary key to select a record, as shown in the following
code.
InventoryItem item = InventoryItem.PK.Find(this, soLine.InventoryID);
To Define a Compound Primary Key and Select a Record by Using This Key
- In the data access class (DAC), declare a
PrimaryKeyOf<Table>.By<keyFields>
descendant with the
public
Find method, which has the needed number of key fields (up to eight). The Find method must call theprotected
FindBy method with the same number of key fields, as shown in the following code.using PX.Data.ReferentialIntegrity.Attributes; public partial class SOLine : PX.Data.PXBqlTable, PX.Data.IBqlTable { public class PK : PrimaryKeyOf<SOLine> .By<orderType, orderNbr, lineNbr> { public static SOLine Find( PXGraph graph, string orderType, string orderNbr, int? lineNbr) => FindBy(graph, orderType, orderNbr, lineNbr); } public abstract class orderType : PX.Data.BQL.BqlString.Field<orderType> { } public abstract class orderNbr : PX.Data.BQL.BqlString.Field<orderNbr> { } public abstract class lineNbr : PX.Data.BQL.BqlInt.Field<lineNbr> { } }
- Use the compound primary key to select a record, as shown in the following
code.
SOLine line = SOLine.PK.Find( this, split.OrderType, split.OrderNbr, split.LineNbr);
Note: The primary key also provides a generic overload of theFind
method so that you can select an current entity by using an entity of the same type with filled key fields (similar to thePXCache.Locate
method), as shown in the following example.SOLine actualItem = SOLine.PK.Find(this, notActualItem);