Delen via


Wijzigingen in metagegevens ophalen en detecteren

 

Gepubliceerd: januari 2017

Is van toepassing op: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

Met de klassen in de Microsoft.Xrm.Sdk.Metadata.Query-naamruimte en de klassen RetrieveMetadataChangesResponse en RetrieveMetadataChangesRequest kunt u efficiënte metagegevensquery's maken en wijzigingen in metagegevens vastleggen wanneer ze zich voordoen.

Alle codevoorbeelden waarnaar in dit document wordt verwezen, bevinden zich in Voorbeeld: Metagegevens opvragen en wijzigingen detecteren.

Het technisch artikel Query's op metagegevens uitvoeren met JavaScript verschaft een JavaScript-bibliotheek om de objecten en berichten in clientcode te gebruiken.

In dit onderwerp

Strategieën om metagegevens te gebruiken

Alleen de metagegevens ophalen die u nodig hebt

Nieuwe of gewijzigde metagegevens ophalen

Informatie over verwijderde metagegevens ophalen

Strategieën om metagegevens te gebruiken

Met metagegevens kunt u toepassingen maken die zich aanpassen als het Microsoft Dynamics 365-gegevensmodel verandert. Metagegevens zijn belangrijk voor de volgende typen toepassingen:

  • UI voor clienttoepassingen

  • Integratiehulpprogramma's die Dynamics 365-gegevens moeten toewijzen aan externe systemen

  • Ontwikkelingshulpmiddelen

Met de klassen in de Microsoft.Xrm.Sdk.Metadata.Query-naamruimte kunt u ontwerpen implementeren die het midden houden tussen een lichtgewichtquery en een permanente metagegevenscache.

Lichtgewichtquery

Een voorbeeld van een lichtgewichtquery is wanneer u een UI van een aangepaste webresource hebt die een selectiebesturingselement biedt om de huidige opties in een Microsoft CRM-kenmerk van het type Microsoft Dynamics 365 Optieset (selectielijst) weer te geven. U wilt deze opties niet hard coderen omdat u de code dan zou moeten bijwerken als de beschikbare opties ooit veranderen. In plaats daarvan kunt u een query maken om deze optiewaarden en labels uit de metagegevens op te halen.

U hoeft deze gegevens niet in een cache te plaatsen, omdat u de Microsoft.Xrm.Sdk.Metadata.Query-klassen kunt gebruiken om deze gegevens direct uit de Microsoft Dynamics 365-toepassingscache op te halen.

Permanente metagegevenscache opnieuw instellen

Als u een toepassing hebt die moet kunnen werken terwijl u niet verbonden bent met de Microsoft Dynamics 365-server, of die gevoelig is voor beperkte netwerkbandbreedte tussen de client en de server, zoals een mobiele toepassing, kunt u een permanente metagegevenscache implementeren.

Met een permanente metagegevenscache moet uw toepassing alle benodigde metagegevens opvragen als voor de eerste keer verbinding wordt gemaakt. Vervolgens moet u die gegevens in de toepassing opslaan. De volgende keer dat de toepassing verbinding met de server maakt, kunt u alleen het verschil ophalen sinds uw laatste query. Dat zouden veel minder te verzenden gegevens moeten zijn. Vervolgens kunnen de wijzigingen in uw metagegevenscache worden samengevoegd wanneer uw toepassing wordt geladen.

Hoe vaak u wijzigingen in metagegevens moet opvragen hangt ervan af hoe vluchtig de gegevens voor uw toepassing zijn en hoe lang uw toepassing actief blijft. Er is geen gebeurtenis beschikbaar die u kunt gebruiken om te detecteren wanneer wijzigingen in metagegevens optreden. Er is een beperking op het aantal dagen dat verwijderde wijzigingen in metagegevens worden opgeslagen en een aanvraag van wijzigingen die voorbij die limiet zijn opgetreden, vereist een volledige re-initialisatie van de metagegevenscache. Raadpleeg Verlooptijd van verwijderde metagegevens voor meer informatie.

Als er geen wijzigingen zijn, zou de query snel moeten antwoorden en hoeven er geen gegevens terug te worden verzonden. Als er echter wijzigingen zijn, vooral als er verwijderde metagegevensitems zijn die uit uw cache moeten worden verwijderd, kunt u verwachten dat de aanvraag extra tijd in beslag zal nemen.Meer informatie:Prestaties bij het ophalen van verwijderde metagegevens

Alleen de metagegevens ophalen die u nodig hebt

Metagegevens worden vaak opgehaald of gesynchroniseerd wanneer een toepassing wordt gestart en kunnen van invloed zijn op hoe lang het duurt voordat de toepassing is geladen. Dit is vooral waar voor mobiele toepassingen die voor het eerst metagegevens ophalen. Alleen de metagegevens ophalen die u nodig hebt, is erg belangrijk om een toepassing te maken die goed presteert.

De klasse EntityQueryExpression biedt een structuur die consistent is met de klasse QueryExpression die u gebruikt om complexe query's te maken om entiteitgegevens op te halen. In tegenstelling tot de klassen RetrieveAllEntitiesRequest, RetrieveEntityRequest, RetrieveAttributeRequest of RetrieveRelationshipRequest bevat de RetrieveMetadataChangesRequest een parameter Query die een EntityQueryExpression-exemplaar accepteert dat u kunt gebruiken om specifieke criteria op te geven voor de gegevens die moeten worden geretourneerd naast de eigenschappen die u wilt. U kunt RetrieveMetadataChangesRequest gebruiken om de volledige reeks metagegevens te retourneren die u krijgt met de RetrieveAllEntitiesRequest of alleen een label voor een specifiek kenmerk.

Geef uw filtercriteria op.

De eigenschap EntityQueryExpression.Criteria accepteert een MetadataFilterExpression die een verzameling MetadataConditionExpression-objecten bevat waarmee voorwaarden kunnen worden gedefinieerd voor het filteren van entiteiteigenschappen op basis van hun waarde. Deze voorwaarden gebruiken een MetadataConditionOperator die de volgende operatoren accepteert:

De MetadataFilterExpression omvat ook een LogicalOperator om aan te geven of And- of Or-logica moet worden toegepast wanneer u de voorwaarden beoordeelt.

Niet alle eigenschappen kunnen als filtercriteria worden gebruikt. Alleen eigenschappen die eenvoudige gegevenstypen, opsommingen, BooleanManagedProperty- of AttributeRequiredLevelManagedProperty-typen vertegenwoordigen, kunnen in een MetadataFilterExpression worden gebruikt. Wanneer een BooleanManagedProperty of een AttributeRequiredLevelManagedProperty wordt opgegeven, wordt alleen de eigenschap Value geëvalueerd.

De volgende tabel bevat een lijst met EntityMetadata-eigenschappen die niet in een MetadataFilterExpression kunnen worden gebruikt:

Attributes

Description

DisplayCollectionName

DisplayName

ManyToManyRelationships

ManyToOneRelationships

OneToManyRelationships

Privileges

Dit voorbeeld toont een MetadataFilterExpression die een set niet-kruisende entiteiten retourneert die eigendom zijn van een gebruiker en die niet staan in een lijst met uit te sluiten entiteiten:



     // An array SchemaName values for non-intersect, user-owned entities that should not be returned.
     String[] excludedEntities = {
"WorkflowLog",
"Template",
"CustomerOpportunityRole",
"Import",
"UserQueryVisualization",
"UserEntityInstanceData",
"ImportLog",
"RecurrenceRule",
"QuoteClose",
"UserForm",
"SharePointDocumentLocation",
"Queue",
"DuplicateRule",
"OpportunityClose",
"Workflow",
"RecurringAppointmentMaster",
"CustomerRelationship",
"Annotation",
"SharePointSite",
"ImportData",
"ImportFile",
"OrderClose",
"Contract",
"BulkOperation",
"CampaignResponse",
"Connection",
"Report",
"CampaignActivity",
"UserEntityUISettings",
"IncidentResolution",
"GoalRollupQuery",
"MailMergeTemplate",
"Campaign",
"PostFollow",
"ImportMap",
"Goal",
"AsyncOperation",
"ProcessSession",
"UserQuery",
"ActivityPointer",
"List",
"ServiceAppointment"};

     //A filter expression to limit entities returned to non-intersect, user-owned entities not found in the list of excluded entities.
     MetadataFilterExpression EntityFilter = new MetadataFilterExpression(LogicalOperator.And);
     EntityFilter.Conditions.Add(new MetadataConditionExpression("IsIntersect", MetadataConditionOperator.Equals, false));
     EntityFilter.Conditions.Add(new MetadataConditionExpression("OwnershipType", MetadataConditionOperator.Equals, OwnershipTypes.UserOwned));
     EntityFilter.Conditions.Add(new MetadataConditionExpression("SchemaName", MetadataConditionOperator.NotIn, excludedEntities));
     MetadataConditionExpression isVisibileInMobileTrue = new MetadataConditionExpression("IsVisibleInMobile", MetadataConditionOperator.Equals, true);
     EntityFilter.Conditions.Add(isVisibileInMobileTrue);


' An array SchemaName values for non-intersect, user-owned entities that should not be returned.
                  Dim excludedEntities() As String =
                      {
                          "WorkflowLog",
                          "Template",
                          "CustomerOpportunityRole",
                          "Import",
                          "UserQueryVisualization",
                          "UserEntityInstanceData",
                          "ImportLog",
                          "RecurrenceRule",
                          "QuoteClose",
                          "UserForm",
                          "SharePointDocumentLocation",
                          "Queue",
                          "DuplicateRule",
                          "OpportunityClose",
                          "Workflow",
                          "RecurringAppointmentMaster",
                          "CustomerRelationship",
                          "Annotation",
                          "SharePointSite",
                          "ImportData",
                          "ImportFile",
                          "OrderClose",
                          "Contract",
                          "BulkOperation",
                          "CampaignResponse",
                          "Connection",
                          "Report",
                          "CampaignActivity",
                          "UserEntityUISettings",
                          "IncidentResolution",
                          "GoalRollupQuery",
                          "MailMergeTemplate",
                          "Campaign",
                          "PostFollow",
                          "ImportMap",
                          "Goal",
                          "AsyncOperation",
                          "ProcessSession",
                          "UserQuery",
                          "ActivityPointer",
                          "List",
                          "ServiceAppointment"
                      }

'A filter expression to limit entities returned to non-intersect, user-owned entities not found in the list of excluded entities.
Dim EntityFilter As New MetadataFilterExpression(LogicalOperator.And)
EntityFilter.Conditions.Add(New MetadataConditionExpression("IsIntersect", MetadataConditionOperator.Equals, False))
EntityFilter.Conditions.Add(New MetadataConditionExpression("OwnershipType", MetadataConditionOperator.Equals, OwnershipTypes.UserOwned))
EntityFilter.Conditions.Add(New MetadataConditionExpression("SchemaName", MetadataConditionOperator.NotIn, excludedEntities))
Dim isVisibileInMobileTrue As New MetadataConditionExpression("IsVisibleInMobile", MetadataConditionOperator.Equals, True)
EntityFilter.Conditions.Add(isVisibileInMobileTrue)

De gewenste proceseigenschappen opgeven

De eigenschap Properties accepteert een MetadataPropertiesExpression. U kunt MetadataPropertiesExpression.AllProperties op true instellen als u alle eigenschappen wilt retourneren of u kunt een verzameling tekenreeksen aan de MetadataPropertiesExpression.PropertyNames opgeven om te definiëren welke eigenschappen u in de resultaten wilt opnemen.

De objecten met sterke typen die worden geretourneerd, omvatten alle eigenschappen, maar alleen die eigenschappen die u aanvraagt, bevatten gegevens. Alle andere eigenschappen zijn leeg, met de volgende uitzonderingen: elk metagegevensitem bevat de waarden MetadataId, LogicalName en HasChanged als die voor dat item bestaan. U hoeft ze niet op te geven in de Properties die u aanvraagt.

Als u geen beheerde code gebruikt en de responseXML parseert die door de XMLHttpRequest wordt geretourneerd, krijgt u elementen voor elke eigenschap, maar alleen de eigenschappen die u aanvraagt, bevatten gegevens. De volgende XML toont de metagegevens van de entiteit contactpersoon die worden geretourneerd wanneer IsVisibleInMobile de enige eigenschap is waarom wordt gevraagd.

<a:EntityMetadata>
 <c:MetadataId>608861bc-50a4-4c5f-a02c-21fe1943e2cf</c:MetadataId>
 <c:HasChanged i:nil="true"/>
 <c:ActivityTypeMask i:nil="true"/>
 <c:Attributes i:nil="true"/>
 <c:AutoRouteToOwnerQueue i:nil="true"/>
 <c:CanBeInManyToMany i:nil="true"/>
 <c:CanBePrimaryEntityInRelationship i:nil="true"/>
 <c:CanBeRelatedEntityInRelationship i:nil="true"/>
 <c:CanCreateAttributes i:nil="true"/>
 <c:CanCreateCharts i:nil="true"/>
 <c:CanCreateForms i:nil="true"/>
 <c:CanCreateViews i:nil="true"/>
 <c:CanModifyAdditionalSettings i:nil="true"/>
 <c:CanTriggerWorkflow i:nil="true"/>
 <c:Description i:nil="true"/>
 <c:DisplayCollectionName i:nil="true"/>
 <c:DisplayName i:nil="true"/>
 <c:IconLargeName i:nil="true"/>
 <c:IconMediumName i:nil="true"/>
 <c:IconSmallName i:nil="true"/>
 <c:IsActivity i:nil="true"/>
 <c:IsActivityParty i:nil="true"/>
 <c:IsAuditEnabled i:nil="true"/>
 <c:IsAvailableOffline i:nil="true"/>
 <c:IsChildEntity i:nil="true"/>
 <c:IsConnectionsEnabled i:nil="true"/>
 <c:IsCustomEntity i:nil="true"/>
 <c:IsCustomizable i:nil="true"/>
 <c:IsDocumentManagementEnabled i:nil="true"/>
 <c:IsDuplicateDetectionEnabled i:nil="true"/>
 <c:IsEnabledForCharts i:nil="true"/>
 <c:IsImportable i:nil="true"/>
 <c:IsIntersect i:nil="true"/>
 <c:IsMailMergeEnabled i:nil="true"/>
 <c:IsManaged i:nil="true"/>
 <c:IsMappable i:nil="true"/>
 <c:IsReadingPaneEnabled i:nil="true"/>
 <c:IsRenameable i:nil="true"/>
 <c:IsValidForAdvancedFind i:nil="true"/>
 <c:IsValidForQueue i:nil="true"/>
 <c:IsVisibleInMobile>
  <a:CanBeChanged>false</a:CanBeChanged>
  <a:ManagedPropertyLogicalName>canmodifymobilevisibility</a:ManagedPropertyLogicalName>
  <a:Value>false</a:Value>
 </c:IsVisibleInMobile>
 <c:LogicalName>contact</c:LogicalName>
 <c:ManyToManyRelationships i:nil="true"/>
 <c:ManyToOneRelationships i:nil="true"/>
 <c:ObjectTypeCode i:nil="true"/>
 <c:OneToManyRelationships i:nil="true"/>
 <c:OwnershipType i:nil="true"/>
 <c:PrimaryIdAttribute i:nil="true"/>
 <c:PrimaryNameAttribute i:nil="true"/>
 <c:Privileges i:nil="true"/>
 <c:RecurrenceBaseEntityLogicalName i:nil="true"/>
 <c:ReportViewName i:nil="true"/>
 <c:SchemaName i:nil="true"/>
</a:EntityMetadata>

In een toekomstige versie kunnen mogelijk nadere efficiënties worden bereikt door geen elementen te retourneren met lege waarden voor eigenschappen waarom niet is gevraagd. Als u code schrijft om deze XML te parseren, moet u verwachten dat de voor dezelfde query geretourneerde XML kan worden gereduceerd tot alleen de volgende XML.

<a:EntityMetadata>
 <c:MetadataId>608861bc-50a4-4c5f-a02c-21fe1943e2cf</c:MetadataId>
 <c:IsVisibleInMobile>
  <a:CanBeChanged>false</a:CanBeChanged>
  <a:ManagedPropertyLogicalName>canmodifymobilevisibility</a:ManagedPropertyLogicalName>
  <a:Value>false</a:Value>
 </c:IsVisibleInMobile>
 <c:LogicalName>contact</c:LogicalName>
</a:EntityMetadata>

Metagegevens worden geretourneerd in een hiërarchische structuur, net als met de RetrieveAllEntitiesRequest. Voor toegang tot een specifiek kenmerk of een specifieke relatie moet u een query maken die de entiteit retourneert waar ze deel van uitmaken. Als u gegevens over een specifiek kenmerk wilt ophalen, moet u de eigenschap EntityMetadata.Attributes opnemen in uw EntityQueryExpression.Properties. Voor de te retourneren entiteitrelaties moet u een of meer van de volgende EntityMetadata-eigenschappen opgeven: ManyToManyRelationships, ManyToOneRelationships of OneToManyRelationships.

In het volgende voorbeeld wordt de eigenschap Attributes geretourneerd voor aangevraagde entiteiten:


//A properties expression to limit the properties to be included with entities
MetadataPropertiesExpression EntityProperties = new MetadataPropertiesExpression()
{
 AllProperties = false
};
EntityProperties.PropertyNames.AddRange(new string[] { "Attributes" });

'A properties expression to limit the properties to be included with entities
Dim EntityProperties As New MetadataPropertiesExpression() With {.AllProperties = False}
EntityProperties.PropertyNames.AddRange(New String() { "Attributes" })

Kenmerkmetagegevens ophalen

De eigenschap EntityQueryExpression.AttributeQuery accepteert een AttributeQueryExpression die Criteria en Properties definieert voor kenmerken de worden geretourneerd voor de entiteiten die overeenkomen met de EntityQueryExpressionCriteria en Properties.

De volgende tabel bevat AttributeMetadata-eigenschappen die niet in een MetadataFilterExpression kunnen worden gebruikt

Description

DisplayName

OptionSet

Targets

Het volgende voorbeeld beperkt geretourneerde kenmerken tot alleen de kenmerken die een OptionSet hebben en retourneert alleen de eigenschappen OptionSet en AttributeType voor die kenmerken:


//A condition expresson to return optionset attributes
MetadataConditionExpression[] optionsetAttributeTypes = new MetadataConditionExpression[] { 
new MetadataConditionExpression("AttributeType", MetadataConditionOperator.Equals, AttributeTypeCode.Picklist),
new MetadataConditionExpression("AttributeType", MetadataConditionOperator.Equals, AttributeTypeCode.State),
new MetadataConditionExpression("AttributeType", MetadataConditionOperator.Equals, AttributeTypeCode.Status),
new MetadataConditionExpression("AttributeType", MetadataConditionOperator.Equals, AttributeTypeCode.Boolean)
};

//A filter expression to apply the optionsetAttributeTypes condition expression
MetadataFilterExpression AttributeFilter = new MetadataFilterExpression(LogicalOperator.Or);
AttributeFilter.Conditions.AddRange(optionsetAttributeTypes);

//A Properties expression to limit the properties to be included with attributes
MetadataPropertiesExpression AttributeProperties = new MetadataPropertiesExpression() { AllProperties = false };
AttributeProperties.PropertyNames.Add("OptionSet");
AttributeProperties.PropertyNames.Add("AttributeType");

'A condition expresson to return optionset attributes
                  Dim optionsetAttributeTypes() As MetadataConditionExpression =
                      {
                          New MetadataConditionExpression("AttributeType",
                                                          MetadataConditionOperator.Equals,
                                                          AttributeTypeCode.Picklist),
                          New MetadataConditionExpression("AttributeType",
                                                          MetadataConditionOperator.Equals,
                                                          AttributeTypeCode.State),
                          New MetadataConditionExpression("AttributeType",
                                                          MetadataConditionOperator.Equals,
                                                          AttributeTypeCode.Status),
                          New MetadataConditionExpression("AttributeType",
                                                          MetadataConditionOperator.Equals,
                                                          AttributeTypeCode.Boolean)
                      }

'A filter expression to apply the optionsetAttributeTypes condition expression
Dim AttributeFilter As New MetadataFilterExpression(LogicalOperator.Or)
AttributeFilter.Conditions.AddRange(optionsetAttributeTypes)

'A Properties expression to limit the properties to be included with attributes
Dim AttributeProperties As New MetadataPropertiesExpression() With {.AllProperties = False}
AttributeProperties.PropertyNames.Add("OptionSet")
AttributeProperties.PropertyNames.Add("AttributeType")

Relatiemetagegevens ophalen

De eigenschap EntityQueryExpression.RelationshipQuery accepteert een RelationshipQueryExpression om de entiteitrelatie Criteria en Properties op te geven die u wilt voor de entiteiten die overeenkomen met de EntityQueryExpressionCriteria en Properties.

Gebruik de eigenschap RelationshipType in uw criteria om op te geven of u ManyToMany-relaties of OneToMany wilt retourneren.

De volgende tabel bevat een eigenschappen met relatiemetagegevens die niet kunnen worden gebruikt in een MetadataFilterExpression:

OneToManyRelationshipMetadata.AssociatedMenuConfiguration

OneToManyRelationshipMetadata.CascadeConfiguration

ManyToManyRelationshipMetadata.Entity1AssociatedMenuConfiguration

ManyToManyRelationshipMetadata.Entity2AssociatedMenuConfiguration

Labels ophalen

De eigenschap EntityQueryExpression.LabelQuery accepteert ten slotte een LabelQueryExpression waarmee u een of meer gehele LCID-getalwaarden kunt opgeven om te bepalen welke gelokaliseerde labels moeten worden geretourneerd.U vindt de geldige lokale id-waarden in het Diagram van LCID (id van landinstelling). Als een organisatie verschillende taalpakketten heeft geïnstalleerd, worden de labels voor alle talen geretourneerd, tenzij u een LabelQuery opgeeft.

Het volgende voorbeeld definieert een LabelQueryExpression die labels beperkt tot alleen de labels die de voorkeurstaal van de gebruiker vertegenwoordigen.


private Guid _userId;
private int _languageCode;

_userId = ((WhoAmIResponse)_service.Execute(new WhoAmIRequest())).UserId;
_languageCode = RetrieveUserUILanguageCode(_userId);

protected int RetrieveUserUILanguageCode(Guid userId)
{
 QueryExpression userSettingsQuery = new QueryExpression("usersettings");
 userSettingsQuery.ColumnSet.AddColumns("uilanguageid", "systemuserid");
 userSettingsQuery.Criteria.AddCondition("systemuserid", ConditionOperator.Equal, userId);
 EntityCollection userSettings = _service.RetrieveMultiple(userSettingsQuery);
 if (userSettings.Entities.Count > 0)
 {
  return (int)userSettings.Entities[0]["uilanguageid"];
 }
 return 0;
}


//A label query expression to limit the labels returned to only those for the user's preferred language
LabelQueryExpression labelQuery = new LabelQueryExpression();
labelQuery.FilterLanguages.Add(_languageCode);

Private _userId As Guid
Private _languageCode As Integer
_userId = (CType(_service.Execute(New WhoAmIRequest()), WhoAmIResponse)).UserId
_languageCode = RetrieveUserUILanguageCode(_userId)
 Protected Function RetrieveUserUILanguageCode(ByVal userId As Guid) As Integer
  Dim userSettingsQuery As New QueryExpression("usersettings")
  userSettingsQuery.ColumnSet.AddColumns("uilanguageid", "systemuserid")
  userSettingsQuery.Criteria.AddCondition("systemuserid", ConditionOperator.Equal, userId)
  Dim userSettings As EntityCollection = _service.RetrieveMultiple(userSettingsQuery)
  If userSettings.Entities.Count > 0 Then
Return CInt(Fix(userSettings.Entities(0)("uilanguageid")))
  End If
  Return 0
 End Function
'A label query expression to limit the labels returned to only those for the user's preferred language
Dim labelQuery As New LabelQueryExpression()
labelQuery.FilterLanguages.Add(_languageCode)

Nieuwe of gewijzigde metagegevens ophalen

De klasse RetrieveMetadataChangesResponse retourneert een EntityMetadataCollection met een sterk type die de aangevraagde gegevens bevat. De klasse RetrieveMetadataChangesResponse levert ook een ServerVersionStamp-waarde die u in latere aanvragen kunt doorgeven aan de eigenschap RetrieveMetadataChangesRequest.ClientVersionStamp. Als een waarde voor de eigenschap ClientVersionStamp wordt opgenomen, worden alleen gegevens die overeenkomen met de EntityQueryExpression en zijn gewijzigd sinds het ClientVersionStamp is opgehaald, geretourneerd. De enige uitzondering is wanneer uw EntityQueryExpression.PropertiesEntityMetadata.Privileges bevat. Bevoegdheden worden altijd geretourneerd, ongeacht het ClientVersionStamp. Op deze manier kan de toepassing nagaan of zich belangrijke wijzigingen hebben voorgedaan die u van belang vindt, sinds u voor het laatst de metagegevens hebt opgevraagd. U kunt vervolgens eventuele nieuwe of gewijzigde metagegevens in uw permanente metagegevenscache samenvoegen, zodat uw toepassing de prestatieproblemen kan vermijden die voortkomen uit het downloaden van metagegevens die u niet nodig hebt.

De eigenschap HasChanged biedt een manier om te detecteren welke onderliggende elementen in een metagegevensitem zijn gewijzigd. Omdat alle metagegevens als onderdeel van het omvattende metagegevensitem worden geretourneerd, worden wanneer het label van een OptionMetadata is gewijzigd, de omvattende eigenschappen EntityMetadata, AttributeMetadata en OptionSetMetadata geretourneerd. De eigenschap HasChanged zal echter onwaar zijn voor die omvattende metagegevensitems. Alleen de eigenschap OptionMetadata.HasChanged zal waar zijn.

Het volgende voorbeeld doet een eerste verzoek door een EntityQueryExpression te definiëren en een aanvraag uit te voeren met een ClientVersionStamp ingesteld op nul.


//An entity query expression to combine the filter expressions and property expressions for the query.
EntityQueryExpression entityQueryExpression = new EntityQueryExpression()
{

 Criteria = EntityFilter,
 Properties = EntityProperties,
 AttributeQuery = new AttributeQueryExpression()
 {
  Criteria = AttributeFilter,
  Properties = AttributeProperties
 },
 LabelQuery = labelQuery

};

//Retrieve the metadata for the query without a ClientVersionStamp
RetrieveMetadataChangesResponse initialRequest = getMetadataChanges(entityQueryExpression, null, DeletedMetadataFilters.OptionSet);

protected RetrieveMetadataChangesResponse getMetadataChanges(
 EntityQueryExpression entityQueryExpression,
 String clientVersionStamp,
 DeletedMetadataFilters deletedMetadataFilter)
{
 RetrieveMetadataChangesRequest retrieveMetadataChangesRequest = new RetrieveMetadataChangesRequest()
 {
  Query = entityQueryExpression,
  ClientVersionStamp = clientVersionStamp,
  DeletedMetadataFilters = deletedMetadataFilter
 };

 return (RetrieveMetadataChangesResponse)_service.Execute(retrieveMetadataChangesRequest);

}

'An entity query expression to combine the filter expressions and property expressions for the query.
                  Dim entityQueryExpression_Renamed As New EntityQueryExpression() With
                      {
                          .Criteria = EntityFilter,
                          .Properties = EntityProperties,
                          .AttributeQuery = New AttributeQueryExpression() With
                                            {
                                                .Criteria = AttributeFilter,
                                                .Properties = AttributeProperties
                                            },
                          .LabelQuery = labelQuery
                      }

'Retrieve the metadata for the query without a ClientVersionStamp
                  Dim initialRequest As RetrieveMetadataChangesResponse =
                      getMetadataChanges(entityQueryExpression_Renamed, Nothing, DeletedMetadataFilters.OptionSet)

Protected Function getMetadataChanges(ByVal entityQueryExpression_Renamed As EntityQueryExpression,
                                      ByVal clientVersionStamp As String,
                                      ByVal deletedMetadataFilter As DeletedMetadataFilters) As RetrieveMetadataChangesResponse
    Dim retrieveMetadataChangesRequest_Renamed As New RetrieveMetadataChangesRequest() With
        {
            .Query = entityQueryExpression_Renamed,
            .ClientVersionStamp = clientVersionStamp,
            .DeletedMetadataFilters = deletedMetadataFilter
        }

    Return CType(_service.Execute(retrieveMetadataChangesRequest_Renamed), RetrieveMetadataChangesResponse)

End Function

Informatie over verwijderde metagegevens ophalen

De eigenschap RetrieveMetadataChangesResponse.DeletedMetadata retourneert een DeletedMetadataCollection wanneer de eigenschappen ClientVersionStamp en DeletedMetadataFilters zijn ingesteld in de RetrieveMetadataChangesRequest. De DeletedMetadataCollection bevat de MetadataId-waarden van eventuele EntityMetadata-, AttributeMetadata- of RelationshipMetadataBase-objecten die binnen een tijdslimiet uit het systeem zijn verwijderd. Zie Verlooptijd van verwijderde metagegevens voor meer informatie.

Gebruik de opsomming DeletedMetadataFilters met de RetrieveMetadataChangesRequest.DeletedMetadataFilters om de informatie te beperken tot de typen metagegevens waarin u geïnteresseerd bent. De opsomming DeletedMetadataFilters biedt de volgende opties:

U gebruikt ook DeletedMetadataFilters-opsomming als een sleutel tot de RetrieveMetadataChangesResponse.DeletedMetadata om de GUID-waarden te filteren die zijn gevonden in de eigenschap RetrieveMetadataChangesResponse.DeletedMetadata.

Wanneer u een metagegevenscache ontwerpt, zult u de MetadataId willen gebruiken voor elk item, zodat u verwijderde metagegevensitems kunt identificeren en ze kunt wissen.

Verlooptijd van verwijderde metagegevens

Alle metagegevensitems die zijn verwijderd, worden getraceerd gedurende een beperkte tijdsperiode die wordt opgegeven door de Organization.ExpireSubscriptionsInDays-waarde. Deze waarde is standaard ingesteld op 90 dagen. Als de RetrieveMetadataChangesRequest.ClientVersionStamp-waarde aangeeft dat de laatste metagegevensquery dateert van vóór de vervaldatum, genereert de service een ExpiredVersionStamp-fout (0x80044352). Wanneer u gegevens ophaalt om een bestaande metagegevenscache te vernieuwen, moet u altijd proberen deze fout op te vangen en erop voorbereid zijn uw metagegevenscache opnieuw te initialiseren met de resultaten van een tweede aanvraag die is doorgegeven zonder ClientVersionStamp. De fout ExpiredVersionStamp treedt ook op wanneer wijzigingen op de server, zoals wijzigingen in de ExpireSubscriptionsInDays-waarde, van invloed zijn op accurate tracering van de verwijderde metagegevens.

Het volgende voorbeeld geeft een ClientVersionStamp door en vangt het ExpiredVersionStamp op. Als de fout wordt opgevangen, wordt de cache opnieuw geïnitialiseerd in een nieuwe aanvraag met het ClientVersionStamp ingesteld op null.


protected String updateOptionLabelList(EntityQueryExpression entityQueryExpression, String clientVersionStamp)
{
 //Retrieve metadata changes and add them to the cache
 RetrieveMetadataChangesResponse updateResponse;
 try
 {
  updateResponse = getMetadataChanges(entityQueryExpression, clientVersionStamp, DeletedMetadataFilters.OptionSet);
  addOptionLabelsToCache(updateResponse.EntityMetadata, true);
  removeOptionLabelsFromCache(updateResponse.DeletedMetadata, true);

 }
 catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)
 {
  // Check for ErrorCodes.ExpiredVersionStamp (0x80044352)
  // Will occur when the timestamp exceeds the Organization.ExpireSubscriptionsInDays value, which is 90 by default.
  if (ex.Detail.ErrorCode == unchecked((int)0x80044352))
  {
   //reinitialize cache
   _optionLabelList.Clear();

   updateResponse = getMetadataChanges(entityQueryExpression, null, DeletedMetadataFilters.OptionSet);
   //Add them to the cache and display the changes
   addOptionLabelsToCache(updateResponse.EntityMetadata, true);

  }
  else
  {
   throw ex;
  }

 }
 return updateResponse.ServerVersionStamp;
}

Protected Function updateOptionLabelList(ByVal entityQueryExpression_Renamed As EntityQueryExpression,
                                         ByVal clientVersionStamp As String) As String
    'Retrieve metadata changes and add them to the cache
    Dim updateResponse As RetrieveMetadataChangesResponse
    Try
        updateResponse = getMetadataChanges(entityQueryExpression_Renamed, clientVersionStamp, DeletedMetadataFilters.OptionSet)
        addOptionLabelsToCache(updateResponse.EntityMetadata, True)
        removeOptionLabelsFromCache(updateResponse.DeletedMetadata, True)

    Catch ex As FaultException(Of Microsoft.Xrm.Sdk.OrganizationServiceFault)
        ' Check for ErrorCodes.ExpiredVersionStamp (0x80044352)
        ' Will occur when the timestamp exceeds the Organization.ExpireSubscriptionsInDays value, which is 90 by default.
        'INSTANT VB TODO TASK: There is no VB equivalent to 'unchecked' in this context:
        If ex.Detail.ErrorCode = CInt(&amp;H80044352) Then
            'reinitialize cache
            _optionLabelList.Clear()

            updateResponse = getMetadataChanges(entityQueryExpression_Renamed, Nothing, DeletedMetadataFilters.OptionSet)
            'Add them to the cache and display the changes
            addOptionLabelsToCache(updateResponse.EntityMetadata, True)

        Else
            Throw ex
        End If

    End Try
    Return updateResponse.ServerVersionStamp
End Function

Prestaties bij het ophalen van verwijderde metagegevens

Wanneer een metagegevensitem wordt verwijderd, wordt dit opgeslagen in de database en niet in de Microsoft Dynamics 365-metagegevenscache. Hoewel de verwijderde metagegevens beperkt zijn tot de MetadataId en het type metagegevensitem, is toegang tot de database een bewerking die meer serverresources vereist dan eenvoudigweg wijzigingen opvragen.

Zie ook

Microsoft Dynamics 365 uitbreiden op de server
Offline gebruik van de Microsoft Dynamics 365-services
Voorbeeld: Metagegevens opvragen en wijzigingen detecteren
De organisatieservice met Dynamics 365-metagegevens gebruiken
Metagegevens van entiteiten aanpassen
Metagegevens van entiteitskenmerken aanpassen
Aanpassen metagegevens van entiteitsrelaties
Query's op metagegevens uitvoeren met JavaScript

Microsoft Dynamics 365

© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht