Activarea tabelelor virtuale pentru a accepta evenimente Dataverse

Puteți permite entităților virtuale să participe la evenimentele asincrone Dataverse Event Framework și în conectorul PowerAutomate Dataverse Când un rând este adăugat, modificat sau șters declanșator. Această capacitate este activată ca parte a evenimentelor de afaceri Dataverse. Informații suplimentare: Evenimente de business Microsoft Dataverse

Fără configurația descrisă în acest articol, majoritatea entităților virtuale nu participă la conducta Event Framework ca alte entități. Deoarece entitățile virtuale nu participă la canalul de evenimente, nu puteți înregistra pași de plug-in pentru evenimentele de creare, actualizare și ștergere (CUD) care apar și, deși evenimentele CUD apar pentru aceste entități în conectorul Power Automate Dataverse, se afișează o eroare atunci când oamenii încearcă să salveze un flux care le utilizează.

Acest lucru se datorează faptului că entitățile virtuale reprezintă date stocate într-o sursă externă. Dataverse are acces la acea sursă de date ca client, dar alte sisteme pot actualiza datele respective în orice moment fără a trece prin cadrul de evenimente Dataverse.

Există doi pași pentru a activa acest lucru:

  1. Configurarea datelor într-un tabel numit Metadate de entitate virtuală. Când datele din acest tabel sunt configurate pentru a le activa, un set de API-uri noi oferă mijloacele pentru ca sistemul extern să notifice Dataverse atunci când apar evenimente CUD.

    Când există un rând de metadate de entitate virtuală asociat cu EntityMetadata. Metadataid pentru un tabel virtual, următoarele trei setări pot controla dacă o sursă externă vă poate notifica tabelul virtual.

    Când sunt activate individual utilizând metadatele IsOnExternalCreatedEnabledentității virtuale , IsOnExternalDeletedEnabledși IsOnExternalUpdatedEnabled proprietățile booleene, următoarele acțiuni legate devin disponibile pentru a fi apelate de servicii externe.

    Acțiune/Mesaj Descriere
    OnExternalCreated Conține date despre o înregistrare care a fost creată într-un sistem extern expus ca tabel virtual în Dataverse.
    OnExternalUpdated Conține date despre o înregistrare care a fost actualizată într-un sistem extern expus ca tabel virtual în Dataverse.
    OnExternalDeleted Conține date despre o înregistrare care a fost ștearsă într-un sistem extern expus ca tabel virtual în Dataverse.
  2. Sistemul extern care controlează datele trebuie să trimită o solicitare HTTP autentificată către Dataverse utilizând API-urile care au date în metadate de entitate virtuală. Un cont principal de serviciu autentificat efectuează de obicei acest apel. Informații suplimentare: Construirea aplicațiilor web utilizând autentificarea de la server la server (S2S)

    Dar orice aplicație sau utilizator care poate efectua un apel la Dataverse poate trimite solicitarea http necesară pentru a notifica Dataverse că a avut loc evenimentul.

Notă

Entitățile virtuale care utilizează furnizorul OData și sursele de date nerelaționale pot permite anumite înregistrări de pași de plug-in, de exemplu numai pentru evenimente din afara tranzacției. Dar aceste evenimente nu sunt disponibile pentru utilizare cu conectorul Power Automate Dataverse. Nu există nicio schimbare în acest comportament. Dar pentru o notificare mai fiabilă a evenimentelor, se recomandă abordarea descrisă în acest subiect.

Cum se activează API-urile de notificare pentru tabelele virtuale

Puteți activa API-urile de notificare configurându-le manual în portalul creatorului (make.powerapps.com/) sau utilizând cod.

Activați manual folosind portalul creatorului

Să presupunem că avem un tabel virtual Person cu aceste proprietăți, proprietatea Name este new_People.

Proprietățile tabelului virtual new_people.

  1. În Power Apps (make.powerapps.com), în soluția dvs., selectați +Nou, apoi selectați Metadate entitate virtuală.

    Adăugați un nou virtualentitymetadata la soluția dvs.

    Se deschide următorul formular:

    Formular virtualentitymetadata.

  2. Completați formularul, setând valoarea ID entitate extensie la numele tabelului virtual. Nu trebuie să activați toate cele trei mesaje. Puteți seta unul sau mai multe dintre ele și reveni pentru a activa restul mai târziu.

După ce ați activat aceste mesaje, puteți observa și confirma ceea ce a fost adăugat folosind pașii din Vizualizați mesajele create pentru a vă susține tabelul virtual.

Setarea proprietăților gestionate utilizând portalul maker

Dacă nu doriți ca persoanele care instalează soluția gestionată să modifice comportamentele metadatelor entității virtuale, ar trebui să setați proprietatea gestionată pentru a o împiedica utilizând pașii următori.

  1. În soluția dvs., selectați Metadatele entității virtuale și selectați punctele de suspensie (...) și apoi selectați Proprietăți gestionate.

    Navigați la Proprietăți gestionate.

  2. În panoul Proprietăți gestionate, deselectați Permiteți particularizări și apăsați Terminat.

    Deselectați Permiteți personalizări.

    Această setare nu va face nimic până când înregistrarea metadatelor entității virtuale nu este inclusă într-o soluție gestionată.

Activați cu cod

Poate doriți să automatizați crearea de metadate de entitate virtuală pentru entitățile virtuale.

Tabelul VirtualEntityMetadata are următoarele coloane pe care le puteți seta:

Nume schemă
Nume logic
Nume afișat Tip Descriere
ExtensionOfRecordId
extensionofrecordid
Entitate virtuală Căutare Numele entității virtuale pentru care sunt aceste setări.
IsCustomizable
iscustomiable
Este personalizabil Proprietate gestionată Controlează dacă metadatele entității virtuale pot fi modificate sau șterse atunci când sunt incluse într-o soluție gestionată.
IsOnExternalCreatedEnabled
isonexternalcreatedenabled
Activați mesajul de creare externă Boolean Activează un mesaj pentru a trimite informații despre înregistrările noi create în sursa de date externă.
IsOnExternalDeletedEnabled
isonexternaldeletedenabled
Activați mesajul de ștergere extern Boolean Activează un mesaj pentru a trimite informații despre înregistrările șterse din sursa de date externă.
IsOnExternalUpdatedEnabled
isonexternalupdatedenabled
Activați mesajul de actualizare externă Boolean Activează un mesaj pentru a trimite informații despre înregistrările actualizate din sursa de date externă.
Name
name
Nume Șir Numele setărilor.
VirtualEntityMetadataId
virtualentitymetadataid
Metadate VirtualEntity Identificator unic Identificator unic pentru instanțele de entitate

Când creați aceste tipuri de componente ale soluției, vă recomandăm să setați proprietatea gestionată IsCustomizable la este false , cu excepția cazului în care doriți să permiteți persoanelor care instalează soluția gestionată să poată modifica aceste setări.

De asemenea, vă recomandăm să adăugați înregistrarea Metadate entitate virtuală** la o anumită soluție atunci când o creați. În ambele exemple de mai jos, veți vedea cum se transmite cu Solution.UniqueName solicitarea care creează înregistrarea.

Utilizarea API-ului web

Când utilizați API-ul Web, prima sarcină este să obțineți tabelul MetadataId virtual. Următorul exemplu returnează pentru o entitate MetadataId virtuală numită new_people.

Cerere:

GET [Organization Uri]/api/data/v9.1/EntityDefinitions(LogicalName='new_people')?$select=MetadataId HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Authorization: Bearer [REDACTED]

răspuns :

HTTP/1.1 200 OK

{
    "@odata.context": "[Organization Uri]/api/data/v9.1/$metadata#EntityDefinitions(MetadataId)/$entity",
    "MetadataId": "b198e6f3-3dd6-4c0b-9570-702f0c10d577"
}

Apoi, creați înregistrarea de metadate a entității virtuale în timp ce o asociați la tipul Entity de entitate folosind recuperat MetadataId în primul pas.

Rețineți utilizarea antetului MSCRM.SolutionUniqueName setat la Solution.UniqueName valoare. Aceasta adaugă înregistrarea de metadate a entității virtuale la soluție pe măsură ce este creată. Informații suplimentare: Anteturi HTTP

Cerere:

POST [Organization Uri]/api/data/v9.1/virtualentitymetadatas HTTP/1.1
MSCRM.SolutionUniqueName: YourSolutionUniqueName
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Authorization: Bearer [REDACTED]
Content-Type: application/json; charset=utf-8

{
  "@odata.type": "Microsoft.Dynamics.CRM.virtualentitymetadata",
  "name": "Person Virtual Metadata",
  "iscustomizable": {
    "@odata.type": "Microsoft.Dynamics.CRM.BooleanManagedProperty",
    "Value": false,
    "CanBeChanged": false
  },
  "isonexternalcreatedenabled": true,
  "isonexternaldeletedenabled": true,
  "isonexternalupdatedenabled": true,
  "extensionofrecordid@odata.bind": "entities(b198e6f3-3dd6-4c0b-9570-702f0c10d577)"
}

răspuns :

HTTP/1.1 204 No Content

Utilizarea SDK-ului pentru .NET

Indiferent dacă utilizați tipuri legate timpuriu sau târziu, prima sarcină este să preluați MetadataId tabelul, care este preluat în același mod pentru ambele cazuri. În acest caz, pentru un tabel virtual numit new_peoplefolosind CrmServiceClient. Alternativ, poate fi folosită clasa ServiceClient .

var service = new CrmServiceClient(conn);
// var service = new ServiceClient(conn);

var retrieveEntityRequest = new RetrieveEntityRequest
{
    LogicalName = "new_people",
    EntityFilters = EntityFilters.Entity
};

var retrieveEntityResponse = (RetrieveEntityResponse)service.Execute(retrieveEntityRequest);

var entityId = retrieveEntityResponse.EntityMetadata.MetadataId;

Utilizarea tipurilor cu legături timpurii

Cu tipurile legate timpuriu, puteți utiliza clasa VirtualEntityMetadata generată utilizând comanda Power Platform CLI pac modelbuilder build. Informații suplimentare: Programare legată târziu și legată devreme utilizând SDK-ul pentru .NET

var virtualEntityMetadata = new VirtualEntityMetadata
{
    Name = "Person Virtual Metadata",
    ExtensionOfRecordId = new EntityReference("entity", entityId.Value),
    IsCustomizable = new BooleanManagedProperty(false),
    IsOnExternalCreatedEnabled = true,
    IsOnExternalDeletedEnabled = true,
    IsOnExternalUpdatedEnabled = true,
};

Utilizarea tipurilor cu legături târzii

Există două moduri de a instanța de metadate a entității virtuale folosind tipuri legate târziu, oricare este echivalentă:

var virtualEntityMetadata = new Entity("virtualentitymetadata");
virtualEntityMetadata["name"] = "Person Virtual Metadata";
virtualEntityMetadata["extensionofrecordid"] = new EntityReference("entity", entityId.Value);
virtualEntityMetadata["iscustomizable"] = new BooleanManagedProperty(false);
virtualEntityMetadata["isonexternalcreatedenabled"] = true;
virtualEntityMetadata["isonexternaldeletedenabled"] = true;
virtualEntityMetadata["isonexternalupdatedenabled"] = true;

Sau:

  var virtualEntityMetadata = new Entity("virtualentitymetadata") { 
      Attributes = new AttributeCollection {
          { "name","Person Virtual Metadata" },
          { "extensionofrecordid", new EntityReference("entity", entityId.Value)},
          { "iscustomizable",new BooleanManagedProperty(false)},
          { "isonexternalcreatedenabled",true },
          { "isonexternaldeletedenabled",true },
          { "isonexternalupdatedenabled",true}
      }            
  };

Crearea înregistrării

Când creați înregistrarea, utilizați clasa CreateRequest mai degrabă decât metoda IOrganizationService.Create, astfel încât să puteți include parametrul opțional SolutionUniqueName care adaugă înregistrarea la soluție atunci când o creați. Informații suplimentare: Transmiterea parametrilor opționali cu o solicitare

var createRequest = new CreateRequest
{
    Target = virtualEntityMetadata
};
createRequest["SolutionUniqueName"] = "YourSolutionUniqueName";

service.Execute(createRequest);

Vizualizați mesajele create pentru a vă susține masa virtuală

O modalitate ușoară de a verifica dacă există mesajele pe care le-ați activat este să examinați API-ul Web $metadata documentul de serviciu.

Puteți face acest lucru în browserul dvs. Folosind adresa URL pentru organizația dvs., tastați următoarele în browser:

[Organization Uri]/api/data/v9.2/$metadata

Acesta este un document XML mare, dar puteți căuta 'OnExternalCreated' și puteți găsi definiția acțiunii, în acest caz pentru tabelul new_people virtual.

<Action Name="OnExternalCreated" IsBound="true">
 <Parameter Name="entityset" Type="Collection(mscrm.new_people)" Nullable="false"/>
 <Parameter Name="Target" Type="mscrm.crmbaseentity" Nullable="false"/>
</Action>

Puteți vedea că aceasta este o acțiune OData legată de setul new_people de entități. Veți găsi acțiuni similare OnExternalUpdatedpentru OnExternalDeletedși :

<Action Name="OnExternalDeleted" IsBound="true">
 <Parameter Name="entityset" Type="Collection(mscrm.new_people)" Nullable="false"/>
<Parameter Name="Target" Type="mscrm.crmbaseentity" Nullable="false"/>
</Action>
<Action Name="OnExternalUpdated" IsBound="true">
 <Parameter Name="entityset" Type="Collection(mscrm.new_people)" Nullable="false"/>
 <Parameter Name="Target" Type="mscrm.crmbaseentity" Nullable="false"/>
</Action>

Vizualizarea mesajelor folosind instrumentul de înregistrare a plug-in-ului

Când înregistrați un pas de plug-in folosind instrumentul de înregistrare a plug-in-ului, veți găsi aceste mesaje.

Înregistrarea unui pas de plugin pe mesajul OnExternalCreated pentru entitatea new_people.

Utilizați mesajele pentru a notifica Dataverse despre modificări

Pentru a notifica Dataverse cu privire la modificări, trebuie să apelați API-ul corespunzător. Puteți utiliza fie API-ul web Dataverse, fie SDK-ul pentru .NET.

Înainte de a utiliza aceste mesaje, vă recomandăm să utilizați procedura descrisă în Vizualizarea mesajelor create pentru a accepta tabelul virtual pentru a confirma că există.

Utilizarea API-ului web

Deoarece aceste API-uri sunt acțiuni OData legate de o colecție de tabele, puteți urma modelul documentat aici: Utilizați acțiuni> API web Acțiuni> legate Acțiuni legate la o colecție de tabele. Următoarele sunt câteva exemple care arată utilizarea tabelului new_people virtual.

Dacă valoarea ID este cunoscută de sistemul apelant, aceasta ar trebui să fie întotdeauna inclusă. Instanța de entitate transmisă utilizând parametrul țintă trebuie să aibă setată proprietatea de adnotare corespunzătoare @odata.type pentru a defini tipul de entitate. Dacă acest lucru nu este inclus, se returnează o eroare.

Aceste apeluri ar trebui să revină 204: No Contentîntotdeauna .

OnExternalCreated

Pentru această acțiune, valorile trebuie să includă toate proprietățile setate atunci când a fost creată înregistrarea.

POST [Organization Uri]/api/data/v9.1/new_peoples/Microsoft.Dynamics.CRM.OnExternalCreated HTTP/1.1
Authorization: Bearer [REDACTED]
Content-Type: application/json
 
{
    "Target": {
        "@odata.type": "Microsoft.Dynamics.CRM.new_people",
        "new_name": "John",
        "new_age": 23,
        "new_lastname": "Doe",
        "new_peopleid": "f6f5896b-bf08-455c-9bd3-526760cb3685"
    }
}

OnExternalUpdated

Pentru această acțiune, ar trebui incluse doar acele proprietăți care s-au modificat.

POST [Organization Uri]/api/data/v9.1/new_peoples/Microsoft.Dynamics.CRM.OnExternalUpdated HTTP/1.1
Authorization: Bearer [REDACTED]
Content-Type: application/json
 
{
    "Target": {
        "@odata.type": "Microsoft.Dynamics.CRM.new_people",
        "new_age": 24,
        "new_peopleid": "f6f5896b-bf08-455c-9bd3-526760cb3685"
        }
}

OnExternalDeleted

Pentru această acțiune, este necesar doar identificatorul unic pentru înregistrare.

POST [Organization Uri]/api/data/v9.1/new_peoples/Microsoft.Dynamics.CRM.OnExternalDeleted HTTP/1.1
Authorization: Bearer [REDACTED]
Content-Type: application/json
{
    "Target": {
        "@odata.type": "Microsoft.Dynamics.CRM.new_people",
        "new_peopleid": "f6f5896b-bf08-455c-9bd3-526760cb3685"
        }
}

Utilizarea SDK-ului pentru .NET

Când utilizați SDK-ul pentru .NET, puteți utiliza tipuri de legare timpurie sau târzie. Informații suplimentare: Programare legată târziu și legată devreme utilizând SDK-ul pentru .NET

Tipuri cu legături timpurii

Acest exemplu utilizează CrmServiceClient cu tipuri legate timpuriu, deși ServiceClient ar putea fi utilizat și el.

var service = new CrmServiceClient(conn);
// var service = new ServiceClient(conn);

//OnExternalCreated
var createPerson = new new_people
{
    new_peopleId = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685"),
    new_name = "John",
    new_Age = 23,
    new_LastName = "Doe"
};


var createRequest = new OnExternalCreatedRequest
{
    Target = createPerson
};

service.Execute(createRequest);

//OnExternalUpdated
var updatePerson = new new_people
{
    new_peopleId = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685"),
    new_Age = 24
};


var updateRequest = new OnExternalUpdatedRequest
{
    Target = updatePerson
};

service.Execute(updateRequest);

//OnExternalDeleted
var deletePerson = new new_people
{
    new_peopleId = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685")
};


var deleteRequest = new OnExternalDeletedRequest
{
    Target = deletePerson
};

Tipuri cu legături târzii

Acest exemplu utilizează CrmServiceClient cu tipuri legate târziu, deși ServiceClient ar putea fi utilizat și el.

var service = new CrmServiceClient(conn);
// var service = new ServiceClient(conn);

  //OnExternalCreated
  Entity createPerson = new Entity("new_people");
  createPerson["new_peopleid"] = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685");
  createPerson["new_name"] = "John";
  createPerson["new_age"] = 23;
  createPerson["new_lastname"] = "Doe";

  
  var orgCreateRequest = new OrganizationRequest("OnExternalCreated");
  orgCreateRequest["Target"] = createPerson;

  service.Execute(orgCreateRequest);

  //OnExternalUpdated
  Entity updatePerson = new Entity("new_people");
  updatePerson["new_peopleid"] = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685");
  updatePerson["new_age"] = 24;

  
  var orgUpdateRequest = new OrganizationRequest("OnExternalUpdated");
  orgUpdateRequest["Target"] = updatePerson;

  service.Execute(orgUpdateRequest);

  //OnExternalDeleted
  Entity deletePerson = new Entity("new_people");
  deletePerson["new_peopleid"] = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685");

  
  var orgDeleteRequest = new OrganizationRequest("OnExternalDeleted");
  orgDeleteRequest["Target"] = deletePerson;

  service.Execute(orgDeleteRequest);

Vedeți și

Cadrul evenimentului
Evenimente de afaceri Microsoft Dataverse
Introducere în tabele virtuale (entități)