Wijzigingen in metagegevens ophalen en detecteren
Gepubliceerd: november 2016
Is van toepassing op: Dynamics CRM 2015
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 CRM-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 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 CRM-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 CRM-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:
MetadataConditionOperator.Equals
MetadataConditionOperator.NotEquals
MetadataConditionOperator.GreaterThan
MetadataConditionOperator.LessThan
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:
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
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:
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 OptionMetadataHasChanged 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:
DeletedMetadataFilters.Entity (standaard)
DeletedMetadataFilters.Attribute
DeletedMetadataFilters.Relationship
DeletedMetadataFilters.Label
DeletedMetadataFilters.OptionSet
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(&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 CRM-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
Toepassingen en serveruitbreidingen schrijven
Offline gebruik van de Microsoft Dynamics CRM 2015-services
Voorbeeld: Metagegevens opvragen en wijzigingen detecteren
Breid het metagegevensmodel uit
Metagegevens van entiteiten aanpassen
Metagegevens van entiteitskenmerken aanpassen
Aanpassen metagegevens van entiteitsrelaties
Query's op metagegevens uitvoeren met JavaScript
© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht