Nachrichten mit dem SDK für .NET verwenden
Es ist wichtig zu verstehen, dass alle Datenvorgänge in Dataverse als Nachrichten definiert sind und die Definitionen dieser Nachrichten in Dataverse gespeichert werden.
Jede Nachricht verfügt über Folgendes:
- Einen eindeutigen Namen
- Eine Sammlung an Eingabeparametern
- Eine Sammlung an Ausgabeparametern
Es gibt drei verschiedene Möglichkeiten, wie Sie eine Nachricht mit dem SDK für .NET verwenden können. Dieser werden in den folgenden Abschnitten erklärt:
Methode | Beschreibung |
---|---|
OrganizationRequest- und OrganizationResponse-Klassen | Verwenden Sie diese Klassen, wenn Sie keine SDK-Anforderungs- und Antwortklassen haben. Möglicherweise verwenden Sie lieber diesen Ansatz, anstatt SDK-Anforderungs- und Antwortklassen zu generieren, wenn Sie den Nachrichtennamen und die Details der Eingabe- und Ausgabeparameter kennen. |
SDK-Anforderungs- und Antwortklassen | Die Verwendung dieser Klassen ist die häufigste Art, Nachrichten zu verwenden. Für viele Nachrichten sind bereits Klassen im SDK für .NET festgelegt. Für benutzerdefinierte Aktionen können Sie Klassen generieren. |
IOrganizationService-Methoden | Der IOrganizationService bietet einige Methoden für allgemeine Datenvorgänge. Diese Methoden sind die schnellste und einfachste Möglichkeit, die gängigsten Datenvorgänge auszuführen. |
OrganizationRequest- und OrganizationResponse-Klassen
Hinweis
Die Verwendung der OrganizationRequest- und OrganizationResponse-Klassen ist nicht die üblichste Methode, wie Nachrichten in Dataverse verwendet werden. Diese Klassen demonstrieren jedoch, wie Nachrichten implementiert werden. Dies zu verstehen ist wichtig, um zu verstehen, wie andere Teile von Dataverse funktionieren.
Sie können eine Nachricht ohne SDK-Anforderungs- und Antwortklassen verwenden.
Verwenden Sie die OrganizationRequest-Klasse.
- Legen Sie OrganizationRequest.RequestName fest
- Legen Sie die Elemente in der Sammlung OrganizationRequest.Parameters fest
Senden Sie die Anforderung mit der IOrganizationService.Execute-Methode, die eine OrganizationResponse-Instanz zurückgibt.
Die Elemente in der Sammlung OrganizationResponse.Results enthalten die Ergebnisse.
Wenn Sie beispielsweise einen Firmendatensatz erstellen möchten, können Sie dies folgendermaßen tun:
public static Guid OrganizationRequestExample(IOrganizationService service) {
// Instantiate an Entity instance of type 'account'
var account = new Entity("account");
account["name"] = "Test account";
// Instantiate a collection of parameters with one item 'Target',
// set to the account entity instance
ParameterCollection parameters = new ParameterCollection
{
{ "Target", account }
};
// Instantiate an OrganizationRequest instance setting the
// RequestName and Parameters
OrganizationRequest request = new OrganizationRequest()
{
RequestName = "Create",
Parameters = parameters
};
// Send the request using the IOrganizationService.Execute method
OrganizationResponse response = service.Execute(request);
// Parse the output parameter 'id' from the Results
return (Guid)response.Results["id"];
}
Um einen Firmendatensatz mit dieser Methode zu erstellen, müssen Sie Folgendes kennen:
- Den Namen der Nachricht:
Create
. - Name und Datentyp aller Eingabeparameter: Ein einzelner Parameter mit dem Namen
Target
, der eine Entität ist. - Name und Datentyp aller Ausgabeparameter: Ein einzelner Parameter mit dem Namen
id
, der eine GUID ist.
Diese Informationen werden in Dataverse gespeichert. Die SdkMessage-Tabelle enthält Informationen zu allen Nachrichten.
Dataverse verwaltet Informationen über die Eingabe- und Ausgabeparameter in privaten Tabellen. Sie müssen es nicht abrufen, da es einen einfacheren Weg gibt: die Verwendung der SDK-Anforderungs- und Antwortklassen.
SDK-Anforderungs- und Antwortklassen
SDK-Anforderungs- und Antwortklassen reduzieren die Komplexität der Verwendung der OrganizationRequest- und OrganizationResponse-Klassen. Sie müssen den Namen der Nachricht sowie die Eingabe- und Ausgabeparameter nicht kennen, da diese in den Klassen enthalten sind.
Das SDK für .NET enthält Definitionen für allgemeine Dataverse-Nachrichten in diesen Namespaces:
Namespace | Beschreibung |
---|---|
Microsoft.Xrm.Sdk.Messages | Nachrichten für allgemeine Datenvorgänge und Nachrichten zum Erstellen und Ändern von Schemadaten, die auch als Metadaten bezeichnet werden. |
Microsoft.Crm.Sdk.Messages | Nachrichten für Geschäftslogik und Vorgänge zur Unterstützung spezieller Funktionen zur Unterstützung von Application Lifecycle Management (ALM) und Apps. Einige Nachrichten in diesem Namespace unterstützen Funktionen, die nur in Microsoft Dynamics 365-Geschäftsanwendungen zu finden sind. |
Diese Klassen enthalten Eigenschaften für alle Eingabe- und Ausgabeparameter.
Die Klassen, die mit
*Request
enden, enthalten die Eigenschaften für Eingabeparameter.Diese Klassen erben von der OrganizationRequest-Klasse.
Die Klassen, die mit
*Response
enden, enthalten die Eigenschaften für Ausgabeparameter.Diese Klassen erben von der OrganizationResponse-Klasse.
Um beispielsweise einen Datensatz zu erstellen, können Sie die Klasse Microsoft.Xrm.Sdk.Messages.CreateRequest verwenden, um die Anforderung vorzubereiten. Verwenden Sie IOrganizationService.Execute, um die Anforderung zu senden, und die Ergebnisse liegen in Form einer Microsoft.Xrm.Sdk.Messages.CreateResponse-Klasseninstanz vor.
Im folgenden Beispiel wird die Klasse Microsoft.Xrm.Sdk.Messages.CreateRequest mit einer generierten Klasse mit früher Bindung für die Kontoentität verwendet:
public static Guid CreateRequestExample(IOrganizationService service)
{
// Instantiate an Account using generated early-bound class
var account = new Account
{
Name = "Test account"
};
// Instantiate a CreateRequest
var request = new CreateRequest
{
// Set the Target property
Target = account
};
// Send the request using the IOrganizationService.Execute method
// Cast the OrganizationResponse into a CreateResponse
var response = (CreateResponse)service.Execute(request);
// Return the id property value
return response.id;
}
Generierte Klassen für benutzerdefinierte Aktionen
Es gibt andere Nachrichten, die keine Klassen im SDK haben. Beispielsweise enthalten installierte Lösungen häufig neue Nachrichtendefinitionen, die als benutzerdefinierte Aktionen (benutzerdefinierte API- oder benutzerdefinierte Prozessaktionen) definiert sind. Informationen zum Erstellen eigener Nachrichten
Entwickler können *Request
- und *Response
-Klassen für die in ihrer Umgebung gefundenen Nachrichten mithilfe des Power Platform CLI-Befehls „pac modelbuilder build“ generieren. Benutzen Sie den Parameter --generateActions, um *Request
- und *Response
-Klassen zu generieren. Weitere Informationen über das Generieren von Klassen mit früher Bindung für das SDK für .NET
Übergeben optionaler Parameter mit einer Anfrage
Es gibt mehrere optionale Parameter, die Sie übergeben können, um spezielle Verhalten auf Meldungen anzuwenden. Sie können die IOrganizationService-Methoden nicht verwenden, wenn Sie optionale Parameter nutzen. Sie müssen die SDK-Anforderungsklassen oder die OrganizationRequest-Klasse verwenden.
Mehr Informationen: Optionale Parameter verwenden
IOrganizationService-Methoden
In Ergänzung zu IOrganizationService.Execute-Methode, die IOrganizationService-Schnittstelle gibt an, dass die folgenden Methoden ebenfalls implementiert werden müssen. Diese Methoden kapseln die entsprechenden Anforderungs- und Antwortklassen:
Diese Methoden vereinfachen die Ausführung dieses Vorgangs mit weniger Codezeilen. Das folgende Beispiel verwendet die IOrganizationService.Create-Methode, um einen Firmendatensatz zu erstellen:
public static Guid CreateMethodExample(IOrganizationService service)
{
// Instantiate an Account using generated early-bound class
var account = new Account
{
Name = "Test account"
};
// Use the Create method to get the id of the created account.
return service.Create(account);
}
Wie Sie sehen, werden allgemeine Datenvorgänge mithilfe der IOrganizationService-Methoden optimiert, und andere Nachrichten können mit den Request- und Response-Klassen in den SDK-Assemblys einfacher verwendet oder mit Tools generiert werden. In den meisten Fällen müssen Sie die zugrundeliegenden OrganizationRequest- und OrganizationResponse-Klassen nicht verwenden, aber es ist wichtig, die verschiedenen verfügbaren Optionen zur Verwendung von Nachrichten zu verstehen, insbesondere wenn Sie mit benutzerdefinierten APIs und Plug-Ins arbeiten.
Arbeiten mit Nachrichten in Plug-Ins
Die Daten, die einen Vorgang in einem Plug-In beschreiben, haben die Form IExecutionContext.InputParameters und IExecutionContext.OutputParameters.
In den PreValidation
- und PreOperation
-Phasen vor dem main
-Vorgang der Ereignispipeline enthalten die IExecutionContext.InputParameters die OrganizationRequest.Parameters.
Mit einer benutzerdefinierten API liest Ihr Plug-In die IExecutionContext.InputParameters und enthält Logik zum Festlegen der IExecutionContext.OutputParameters im Rahmen der main
-Vorgangsphase.
Nach der main
-Phase des Vorgangs enthalten die IExecutionContext.OutputParameters die OrganizationResponse.Results in der PostOperation
-Phase.
Wenn Sie die Struktur der Meldungen verstehen, erkennen Sie auch, wo Sie die Daten finden, die Sie innerhalb des Plug-Ins prüfen oder ändern möchten.
Weitere Informationen:
- Schreiben von Plug-Ins, um Geschäftsprozesse zu erweitern
- Benutzerdefinierte APIs erstellen und verwenden
- Ereignisframework
Private Nachrichten
Microsoft Dataverse enthält einige Nachrichten, die nicht für Nicht-Microsoft-Entwickler vorgesehen sind. Microsoft hat diese Nachrichten hinzugefügt, um die Funktion zu aktivieren, aber auch Nicht-Microsoft-Lösungen können sie über die Custom-API-Funktion hinzufügen. Die Eigenschaft SdkMessage.IsPrivate sagt Ihnen, welche Meldungen privat sind.
Achtung
Sie sollten keine privaten Nachrichten verwenden, es sei denn, Sie haben sie als Custom-API erstellt. Durch das Markieren einer Nachricht als privat weist der Lösungsherausgeber ausdrücklich darauf hin, dass andere Apps zur Verwendung der Nachricht nicht unterstützt werden. Sie können die Nachricht jederzeit entfernen oder wichtige Änderungen vornehmen. Die Verwendung dieser Nachrichten durch andere Personen als den Lösungsherausgeber wird nicht unterstützt. Das Aufrufen von privaten Nachrichten aus Plug-ins wird nicht unterstützt.
Weitere Informationen: Custom-APIs erstellen und verwenden
Unterstützung von Tabellen für Nachrichten
Einige Nachrichten können mit mehreren Tabellen verwendet werden. Die Create
-, Update
- und Delete
-Nachrichten können zum Beispiel für die meisten Tabellen verwendet werden, aber einige Tabellen unterstützen möglicherweise nicht alle allgemeinen Nachrichten.
Diese Informationen werden in der SdkMessageFilter-Tabelle gespeichert. Sie können diese Tabelle abfragen, um festzustellen, ob Sie eine Nachricht für eine Tabelle verwenden können.
Verwenden Sie diese statische Methode, um eine Liste mit Namen von Nachrichten zu erhalten, die mit einer Tabelle arbeiten können:
/// <summary>
/// Write the names of messages for a table to the console
/// </summary>
/// <param name="service">The authenticated IOrganizationService to use</param>
/// <param name="tableName">The logical name of the table</param>
static void OutputTableMessageNames(IOrganizationService service, string tableName)
{
var query = new QueryExpression(entityName: "sdkmessagefilter")
{
Criteria =
{
Conditions =
{
new ConditionExpression(
attributeName:"primaryobjecttypecode",
conditionOperator: ConditionOperator.Equal,
value: tableName)
}
},
// Link to SdkMessage to get the names
LinkEntities =
{
new LinkEntity(
linkFromEntityName:"sdkmessagefilter",
linkToEntityName: "sdkmessage",
linkFromAttributeName: "sdkmessageid",
linkToAttributeName: "sdkmessageid",
joinOperator: JoinOperator.Inner)
{
EntityAlias = "sdkmessage",
Columns = new ColumnSet("name"),
LinkCriteria =
{
Conditions =
{
// Don't include private messages
new ConditionExpression("isprivate", ConditionOperator.Equal, false)
}
}
}
}
};
EntityCollection results = service.RetrieveMultiple(query);
foreach (var entity in results.Entities)
{
Console.WriteLine(((AliasedValue)entity["sdkmessage.name"]).Value);
}
}
Wenn Sie diese Methode verwenden und den Parameter tableName
auf account
setzen, erhalten Sie Ergebnisse, die diese Nachrichtennamen enthalten:
Ausgabe:
Assign
Create
Delete
GrantAccess
Merge
ModifyAccess
Retrieve
RetrieveMultiple
RetrievePrincipalAccess
RetrieveSharedPrincipalsAndAccess
RevokeAccess
SetState
SetStateDynamicEntity
Update
Hinweis
Einige dieser Nachrichten sind veraltet. SetState
und SetStateDynamicEntity
sind noch vorhanden, aber Sie sollten stattdessen Update
verwenden.
Unterstützung von Nachrichten für Tabellen
Einige Nachrichten können nur mit spezifischen Tabellen verwendet werden. Beispielsweise können Sie die RetrieveUnpublishedMultiple
-Nachricht nur mit einem bestimmten Tabellensatz verwenden, der Daten enthält, die veröffentlicht werden können.
Diese Informationen werden in der SdkMessageFilter-Tabelle gespeichert. Sie können diese Tabelle abfragen, um festzustellen, welche Tabellen für eine spezifische Nachricht verwendet werden können.
Verwenden Sie diese statische Methode, um eine Liste mit Namen von Tabellen zu erhalten, die mit einer Nachricht verwendet werden können.
/// <summary>
/// Write the names of tables for a message to the console
/// </summary>
/// <param name="service">The authenticated IOrganizationService to use</param>
/// <param name="messageName">The name of the message</param>
static void OutputTablesForMessage(IOrganizationService service, string messageName) {
var query = new QueryExpression(entityName: "sdkmessage")
{
Criteria = {
Conditions =
{
new ConditionExpression(
attributeName: "name",
conditionOperator: ConditionOperator.Equal,
value: messageName)
}
},
LinkEntities = {
new LinkEntity(
linkFromEntityName:"sdkmessage",
linkToEntityName: "sdkmessagefilter",
linkFromAttributeName: "sdkmessageid",
linkToAttributeName: "sdkmessageid",
joinOperator: JoinOperator.Inner)
{
EntityAlias = "sdkmessagefilter",
Columns = new ColumnSet("primaryobjecttypecode"),
}
}
};
EntityCollection results = service.RetrieveMultiple(query);
List<string> names = new List<string>();
foreach (var entity in results.Entities)
{
names.Add(((AliasedValue)entity["sdkmessagefilter.primaryobjecttypecode"]).Value as string);
}
names.Distinct().ToList().ForEach(name => Console.WriteLine(name));
}
Wenn Sie diese Methode verwenden und den Parameter messageName
auf RetrieveUnpublishedMultiple
setzen, erhalten Sie Ergebnisse, die diese Tabellennamen enthalten:
Ausgabe:
organizationui
systemform
savedquery
savedqueryvisualization
sitemap
hierarchyrule
appmodule
appconfig
appconfiginstance
webresource
mobileofflineprofile
mobileofflineprofileitem
mobileofflineprofileitemassociation
navigationsetting
appelement
appsetting
teammobileofflineprofilemembership
usermobileofflineprofilemembership
Hinweis
Bei bestimmten Nachrichten werden möglicherweise Platzhalterwerte zurückgegeben, z. B.
DeletedEntity for objectTypeCode=11478
odernew_system_donotuseentity_rp53fd1p1ekxpa_t12_b71d6344c5
. Dies sind keine gültigen Tabellennamen. Ignorieren Sie diese Werte.Diese Abfrage gibt auch private Tabellen zurück. Im vorherigen Beispiel:
organizationui
,hierarchyrule
,appelement
undappsetting
sind private Tabellen und werden für die Verwendung nicht unterstützt.
Siehe auch
Tabellenvorgänge mithilfe des SDK für .NET
Verwenden von ExecuteAsync zum asynchronen Ausführen von Messages
Führt Nachrichten in einer einzelnen Datenbanktransaktion aus.
Mehrere Anforderungen mit dem SDK für .NET ausführen
Hinweis
Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)
Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).