Delen via


Voorbeeld: Aangepaste virtuele tabelprovider met CRUD-bewerkingen

In dit voorbeeld ziet u hoe u een aangepaste gegevensprovider implementeert om een virtuele tabel te maken die ondersteuning biedt voor het maken, ophalen, bijwerken en verwijderen van bewerkingen. Voor elk van deze bewerkingen implementeert u een algemene invoegtoepassing, registreert u deze met behulp van het hulpprogramma voor registratie van invoegtoepassingen en schakelt u gegevensbronnen voor virtuele tabellen in om de virtuele tabel te maken.

Zie Aangepaste gegevensproviders voor meer informatie over gegevensproviders en ontwikkeling van invoegtoepassingen

Details van gegevensbron

In dit scenario stelt u een eenvoudige tabel in een externe SQL Server in om een virtuele tabel te maken. De tabelnaam die in dit voorbeeld wordt gebruikt, is VETicket.

Opmerking

Werk de invoegtoepassingscode bij als u de naam van de tabel of kolom(en) wilt wijzigen.

Kolomnaam Gegevenssoort Purpose
TicketID Unieke geïdentificeerde primaire sleutel Primaire sleutel voor de tabel.
Severity Integer Ernstwaarde van het ticket.
Naam Snaar / Touwtje Ticketbeschrijving.

Er zijn vier stappen om een aangepaste gegevensprovider in te schakelen voor het maken van een virtuele tabel.

Stap 1: Implementatie van CRUD-plug-ins en registreren van de assemblage

Stap 2: Gegevensprovider maken en invoegtoepassingen toevoegen aan de provider

Stap 3: Een virtuele tabel maken in dataverse-omgeving

Stap 4: records maken, bijwerken, weergeven en verwijderen met behulp van een virtuele tabel

Stap 1: CRUD-invoegtoepassingen implementeren en de assembly registreren

  1. Maak uw invoegtoepassingsproject en installeer de volgende NuGet-pakketten. De oplossing in dit voorbeeld heet StubProvider.

    Assembly URL
    Microsoft.CrmSdk.CoreAssemblies https://www.nuget.org/packages/Microsoft.CrmSdk.CoreAssemblies
    Microsoft.CrmSdk.Data https://www.nuget.org/packages/Microsoft.CrmSdk.Data
    Microsoft.CrmSdk.Deployment https://www.nuget.org/packages/Microsoft.CrmSdk.Deployment
    Microsoft.CrmSdk.Workflow https://www.nuget.org/packages/Microsoft.CrmSdk.Workflow
    Microsoft.CrmSdk.XrmTooling.CoreAssembly https://www.nuget.org/packages/Microsoft.CrmSdk.XrmTooling.CoreAssembly
    Microsoft.IdentityModel.Clients.ActiveDirectory https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory
    Microsoft.Rest.ClientRuntime https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime
    Newtonsoft.Json https://www.nuget.org/packages/Newtonsoft.Json/13.0.1-beta2
  2. Voeg de volgende zes klassebestanden toe aan uw oplossing. Voeg in elk van de klassebestanden het volgende toe met behulp van instructies

    using System; 
    using System.Collections.Generic; 
    using System.Data.SqlClient; 
    using System.Linq; using System.Text; 
    using System.Threading.Tasks; 
    using Microsoft.Xrm.Sdk; 
    using Microsoft.Xrm.Sdk.Extensions; 
    using Microsoft.Xrm.Sdk.Data.Exceptions; 
    using Newtonsoft.Json; 
    

    Opmerking

    Werk in elk van deze klassebestanden de tabelnaam bij zodat deze overeenkomt met de naam van de brontabel die u hebt ingesteld. In het voorbeeld wordt VETicket gebruikt als de naam van de brontabel.

    Klassebestandsnaam Purpose
    Connection.cs Deze klasse bevat code voor het maken en beheren van verbinding met de externe SQL-gegevensbron. Het bevat verbindingsreeksparameters die specifiek zijn voor de externe database en op SQL gebaseerde verificatiegegevens die nodig zijn om de verbinding tot stand te brengen. Vervang de waarden die van toepassing zijn op uw: Databaseserver, UserID, Wachtwoord en tabelnaam waarvoor u een virtuele tabel in Dataverse gaat maken.
    CreatePlugin.cs Deze klasse bevat code waarmee de maakbewerking voor de virtuele tabel wordt verwerkt.
    UpdatePlugin.cs Deze klasse bevat code waarmee het bijwerken van records in de virtuele tabel wordt verwerkt.
    RetrievePlugin.cs Deze klasse bevat code waarmee een specifieke record uit de virtuele tabel wordt opgehaald.
    RetrieveMultiplePlugin.cs Deze klasse bevat code voor het ophalen van meerdere records uit de virtuele tabel.
    DeletePlugin.cs Deze klasse bevat code waarmee u een record in de virtuele tabel kunt verwijderen.

Lees de volgende belangrijke informatie over het gebruik van een verbindingsreeks of verificatie met gebruikersnaam/wachtwoord in toepassingscode.

Belangrijk

Microsoft raadt u aan de veiligste verificatiestroom te gebruiken die beschikbaar is. De verificatiestroom die in dit artikel wordt beschreven, vereist een zeer hoge mate van vertrouwen in de toepassing en brengt risico's met zich mee die niet aanwezig zijn in andere stromen. U moet deze stroom alleen gebruiken wanneer andere veiligere stromen, zoals beheerde identiteiten, niet haalbaar zijn.

Code voor Connection.cs

 public static class Connection
{
   public static SqlConnection GetConnection()
   {
       try
       {
           //sample database to connect to 
           SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
           builder.DataSource = "Enter name or network address of the SQL Server";
           builder.UserID = "Enter User Name";
           builder.Password = "Enter password";
           builder.InitialCatalog = "Enter database details";
           SqlConnection connection = new SqlConnection(builder.ConnectionString);
           return connection;
       }
       catch (SqlException e)
       {
           Console.WriteLine(e.ToString());
           throw;
       }
   }
}

Code voor CreatePlugin.cs

public class CreatePlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = serviceProvider.Get<IPluginExecutionContext>();
        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
        {
            Entity entity = (Entity)context.InputParameters["Target"];
            Guid id = Guid.NewGuid();
            //change the table name below to the source table name you have created 
            string cmdString = "INSERT INTO VETicket (TicketID,Name,Severity) VALUES (@TicketID, @Name, @Severity)";
            SqlConnection connection = Connection.GetConnection();
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = cmdString;
                command.Parameters.AddWithValue("@TicketID", id);
                command.Parameters.AddWithValue("@Name", entity["new_name"]);
                command.Parameters.AddWithValue("@Severity", entity["new_severity"]);
                connection.Open();
                try
                {
                    var numRecords = command.ExecuteNonQuery();
                    Console.WriteLine("inserted {0} records", numRecords);
                }
                finally
                {
                    connection.Close();
                }
                // other codes. 
            }
            context.OutputParameters["id"] = id;
        }
    }
}

Code voor UpdatePlugin.cs

public class UpdatePlugin: IPlugin {
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = serviceProvider.Get<IPluginExecutionContext>();
        Guid id = Guid.Empty;
        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
        {
            Entity entity = (Entity)context.InputParameters["Target"];
            //change the table name below to the source table name you have created  
            string cmdString = "UPDATE VETicket SET {0} WHERE TicketID=@TicketID";
            SqlConnection connection = Connection.GetConnection();
            using (SqlCommand command = connection.CreateCommand())
            {
                command.Parameters.AddWithValue("@TicketID", entity["new_ticketid"]);
                List<string> setList = new List<string>();
                if (entity.Attributes.Contains("new_name"))
                {
                    command.Parameters.AddWithValue("@Name", entity["new_name"]);
                    setList.Add("Name=@Name");
                }
                if (entity.Attributes.Contains("new_severity"))
                {
                    command.Parameters.AddWithValue("@Severity", entity["new_severity"]);
                    setList.Add("Severity=@Severity");
                }
                command.CommandText = string.Format(cmdString, string.Join(",", setList)); connection.Open();
                try
                {
                    var numRecords = command.ExecuteNonQuery();
                    Console.WriteLine("updated {0} records", numRecords);
                }
                finally
                {
                    connection.Close();
                }
                // other codes. 
            }
        }
    }
}

Code voor RetrievePlugin.cs

public class RetrievePlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = serviceProvider.Get<IPluginExecutionContext>();
        Guid id = Guid.Empty;
        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
        {
            EntityReference entityRef = (EntityReference)context.InputParameters["Target"];
            Entity e = new Entity("new_ticket");
            //change the table name below to the source table name you have created  
            string cmdString = "SELECT TicketID, Severity, Name FROM VETicket WHERE TicketID=@TicketID";
            SqlConnection connection = Connection.GetConnection();
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = cmdString;
                command.Parameters.AddWithValue("@TicketID", entityRef.Id);
                connection.Open();
                try
                {
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            e.Attributes.Add("new_ticketid", reader.GetGuid(0));
                            e.Attributes.Add("new_severity", reader.GetInt32(1));
                            e.Attributes.Add("new_name", reader.GetString(2));
                        }
                    }
                }
                finally
                {
                    connection.Close();
                }
                // other codes. 
            }
            context.OutputParameters["BusinessEntity"] = e;
        }
    }
}

Code voor RetrieveMultiplePlugin.cs

public class RetrieveMultiplePlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = serviceProvider.Get<IPluginExecutionContext>();
        EntityCollection collection = new EntityCollection();
        //change the table name below to the source table name you have created  
        string cmdString = "SELECT TicketID, Severity, Name FROM VETicket";
        SqlConnection connection = Connection.GetConnection();
        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = cmdString;
            connection.Open();
            try
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Entity e = new Entity("new_ticket");
                        e.Attributes.Add("new_ticketid", reader.GetGuid(0));
                        e.Attributes.Add("new_severity", reader.GetInt32(1));
                        e.Attributes.Add("new_name", reader.GetString(2));
                        collection.Entities.Add(e);
                    }
                }
            }
            finally
            {
                connection.Close();
            }
            context.OutputParameters["BusinessEntityCollection"] = collection;
        }
    }
}

Code voor DeletePlugin.cs

public class DeletePlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = serviceProvider.Get<IPluginExecutionContext>();
        //comment 
        Guid id = Guid.Empty;
        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference)
        {
            EntityReference entityRef = (EntityReference)context.InputParameters["Target"];
            id = entityRef.Id;
            //change the table name below to the source table name you have created 
            string cmdString = "DELETE VETicket WHERE TicketID=@TicketID";
            SqlConnection connection = Connection.GetConnection();
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = cmdString; command.Parameters.AddWithValue("@TicketID", id);
                connection.Open();
                try
                {
                    var numRecords = command.ExecuteNonQuery();
                    Console.WriteLine("deleted {0} records", numRecords);
                }
                finally
                {
                    connection.Close();
                }
                // other codes. 
            }
        }
    }
}
  1. Compileer en bouw de oplossing. U hebt nu een assemblybestand (.dll) dat u kunt gebruiken om u te registreren in uw Dataverse-omgeving. U vindt dit bestand in de map solution folder/bin/Debug.

    Assembly dll.

  2. Registreer de assembly met behulp van het hulpprogramma voor registratie van invoegtoepassingen. U kunt het meest recente Plugin Registratietool-pakket downloaden van NuGet.

  3. Open het hulpprogramma voor registratie van invoegtoepassingen. U moet over systeembeheerbevoegdheden beschikken om de assembly te registreren. Selecteer CREATE NEW CONNECTION om verbinding te maken met uw Dataverse-omgeving. Selecteer de vervolgkeuzelijst Register en selecteer Nieuwe Assembly Registreren.

    Nieuwe stap registreren.

  4. Selecteer het assemblybestand en registreer de invoegtoepassingen. Zorg ervoor dat u alle plug-ins hebt geselecteerd (Create, Update, Delete, Retrieve en RetrieveMultiple).

    Nieuwe assembly registreren.

Stap 2: Gegevensprovider maken en invoegtoepassingen toevoegen aan de provider

  1. Selecteer de vervolgkeuzelijst Registreren en selecteer Vervolgens Nieuwe gegevensprovider registreren.

  2. Voer in het dialoogvenster Nieuwe gegevensprovider registreren de volgende gegevens in:

    1. Voer de naam van de gegevensprovider in.

    2. Selecteer in de optie Oplossingen een bestaande oplossing of maak een nieuwe oplossing in de vervolgkeuzelijst. Als u een nieuwe oplossing wilt maken, selecteert u de optie NewSolution in de vervolgkeuzelijst. Voer in het dialoogvenster Nieuwe oplossing maken de vereiste gegevens in en selecteer Opslaan.

    3. Selecteer In de optie Gegevensbrontabel (entiteit) de optie Nieuwe gegevensbron maken. Voer de details in. Zorg ervoor dat de gegevensbron deel uitmaakt van de oplossing die u hebt gemaakt of geselecteerd.

      Opmerking

      De gegevensbrontabel in Dataverse bevat de configuratiegegevens voor een gegevensbronrecord die moet worden doorgegeven aan de providerinvoegtoepassingen.

    4. Wijs elk van de geregistreerde invoegtoepassingen aan de bijbehorende bewerkingen.

    5. Registreer de nieuwe gegevensprovider.

      Registreer de gegevensprovider.

  3. In het registratieprogramma voor invoegtoepassingen ziet u de nieuwe gegevensbronrecord en de bijbehorende gegevensprovider. Als u de gegevensbron selecteert, worden de details weergegeven die de invoegtoepassingen en hun geregistreerde GUID bevatten.

    Geregistreerde gegevensprovider.

Stap 3: Een virtuele tabel maken in dataverse-omgeving

  1. Maak een nieuwe gegevensbron voor virtuele tabellen door te navigeren naarGegevensbronnen> voor virtuele tabellen(entiteitsbeheer)>.

  2. Selecteer Nieuw en selecteer vervolgens de gegevensprovider die u in de vorige stap in de vervolgkeuzelijst hebt gemaakt.

  3. Voer een naam in voor de gegevensbron en selecteer Opslaan en Sluiten.

  4. U bent nu klaar om de virtuele tabel te maken die de externe gegevensbron vertegenwoordigt. Hiervoor gaat u naar Instellingen>aanpassen van het systeem.

  5. Selecteer tabellen (entiteiten) in het linkernavigatiedeelvenster van Solution Explorer en selecteer Vervolgens Nieuw.

  6. Voer de volgende gegevens in:

    Kolom Description
    Gegevensbron Selecteer de gegevensbron die u in de vorige stap hebt gemaakt.
    Weergavenaam Naam van virtuele tabel.
    Meervoudsnaam De waarde wordt automatisch ingevuld op basis van de weergavenaam.
    Naam Dit wordt ook automatisch gemaakt op basis van de waarde die u invoert voor de weergavenaam.
    Externe naam De naam van de brontabel.
    Naam van externe verzamelingen U kunt dezelfde waarde uit de kolom met meervoudsnamen gebruiken.
  7. Selecteer Opslaan en sluiten.

    Nieuwe record maken.

  8. Selecteer en vouw in het linkernavigatiedeelvenster de virtuele tabel uit die u hebt gemaakt.

  9. Selecteer Velden voor het bijwerken en maken van nieuwe kolommen die de externe bron vertegenwoordigen.

  10. Selecteer de kolom Primaire sleutel voor de virtuele tabel en selecteer Bewerken.

  11. Werk de kolom Externe naam bij zodat deze overeenkomt met de kolomnaam in uw externe gegevensbron. In dit voorbeeld is de naam van de externe kolom TicketID.

    Nieuwe tabel maken.

  12. Selecteer Opslaan en sluiten.

  13. Selecteer het veld Naam voor de virtuele tabel en selecteer Bewerken.

  14. Werk het veld Externe naam bij zodat deze overeenkomt met de veldnaam in uw externe gegevensbron. In dit voorbeeld is de naam van de externe kolom Naam.

    Maak een nieuw naamveld.

  15. Selecteer Opslaan en sluiten.

  16. Selecteer Nieuw om een nieuwe kolom in de virtuele tabel te maken. Deze kolom vertegenwoordigt de ernstkolom in de externe gegevensbron.

  17. Voer de volgende informatie in voor de nieuwe kolommen:

    Kolomnaam Waarde
    Weergavenaam Severity
    Naam new_severity
    Externe naam Severity
    Veldvereiste Onderneming vereist
    Gegevenssoort Geheel getal

    Maak een nieuw ernstveld.

  18. Selecteer Opslaan en sluiten.

Stap 4: records maken, bijwerken, weergeven en verwijderen met behulp van een virtuele tabel

Maak een modelgestuurde app en voeg de virtuele tabel toe aan het siteoverzicht. Selecteer vervolgens het hoofdformulier van de virtuele tabel en de weergave Geavanceerd veld. Publiceer de app. Meer informatie: Uw eerste modelgestuurde app bouwen

Een modelgestuurde app maken.

Toepassingsgebruikers kunnen lees-, create-, update-, verwijderbewerkingen uitvoeren met behulp van de virtuele tabel, net als elke andere tabel in Microsoft Dataverse.

Zie ook

Aan de slag met virtuele tabellen
API-overwegingen voor virtuele tabellen
Aangepaste gegevensproviders voor virtuele tabellen
Overzicht van virtuele tabellen met OData v4-gegevensprovider