แชร์ผ่าน


ตัวอย่าง: ผู้ให้บริการตารางเสมือนแบบกําหนดเองที่มีการดําเนินการ CRUD

ตัวอย่างนี้แสดงวิธีการใช้ตัวให้บริการข้อมูลแบบกําหนดเองเพื่อสร้างตารางเสมือนที่สนับสนุนการสร้าง เรียกใช้ อัปเดต และลบการดําเนินการ สําหรับแต่ละการดําเนินการเหล่านี้ คุณใช้ปลั๊กอินทั่วไป ลงทะเบียนโดยใช้ Plugin Registration Tool และเปิดใช้งานแหล่งข้อมูลตารางเสมือนเพื่อสร้างตารางเสมือน

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับผู้ให้บริการข้อมูลและการพัฒนาปลั๊กอิน โปรดดู ผู้ให้บริการข้อมูลแบบกําหนดเอง

รายละเอียดแหล่งข้อมูล

ในการฝึกปฏิบัตินี้ คุณจะตั้งค่าตารางอย่างง่ายใน SQL Server ภายนอกเพื่อสร้างตารางเสมือน ชื่อตารางที่ใช้ในตัวอย่างนี้คือ VETicket

Note

อัปเดตรหัสปลั๊กอินของคุณ ถ้าคุณต้องการเปลี่ยนชื่อของตารางหรือคอลัมน์

ชื่อคอลัมน์ ชนิดข้อมูล จุดประสงค์
TicketID ตัวระบุเฉพาะ, คีย์หลัก คีย์หลักสําหรับตาราง
ความรุนแรง Integer ค่าความรุนแรงสําหรับตั๋ว
ชื่อ สตริง คําอธิบายของตั๋ว

มีสี่ขั้นตอนในการเปิดใช้งานตัวให้บริการข้อมูลแบบกําหนดเองเพื่อสร้างตารางเสมือน

ขั้นตอนที่ 1: ใช้งานปลั๊กอิน CRUD และลงทะเบียนแอสเซมบลี

ขั้นตอนที่ 2: การสร้างผู้ให้บริการข้อมูลและการเพิ่มปลั๊กอินไปยังผู้ให้บริการ

ขั้นตอนที่ 3: การสร้างตารางเสมือนในสภาพแวดล้อม Dataverse

ขั้นตอนที่ 4: สร้าง อัปเดต ดู และลบเรกคอร์ดโดยใช้ตารางเสมือน

ขั้นตอนที่ 1: ใช้งานปลั๊กอิน CRUD และลงทะเบียนแอสเซมบลี

  1. สร้างโครงการปลั๊กอินของคุณและติดตั้งแพคเกจ NuGet ต่อไปนี้ โซลูชันในตัวอย่างนี้มีชื่อว่า StubProvider

    การประกอบ 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. เพิ่มไฟล์คลาสหกไฟล์ต่อไปนี้ลงในโซลูชันของคุณ ในแต่ละไฟล์คลาส ให้เพิ่มรายการต่อไปนี้โดยใช้คําสั่ง

    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; 
    

    Note

    ในแต่ละไฟล์คลาสเหล่านี้ ให้อัปเดตชื่อตารางเพื่อให้ตรงกับชื่อตารางต้นทางที่คุณตั้งค่า ตัวอย่างนี้ใช้ VETicket เป็นชื่อตารางต้นทาง

    ชื่อไฟล์คลาส จุดประสงค์
    Connection.cs ระดับชั้นนี้ประกอบด้วยรหัสสําหรับการสร้างและจัดการการเชื่อมต่อไปยังแหล่งข้อมูล SQL ภายนอก ซึ่งรวมถึงพารามิเตอร์สตริงการเชื่อมต่อเฉพาะสําหรับฐานข้อมูลภายนอกและข้อมูลการรับรองความถูกต้องที่ใช้ SQL ที่จําเป็นในการสร้างการเชื่อมต่อ แทนที่ค่าที่เกี่ยวข้องกับของคุณ: เซิร์ฟเวอร์ฐานข้อมูล UserID รหัสผ่าน และชื่อตารางที่คุณจะสร้างตารางเสมือนใน Dataverse
    CreatePlugin.cs คลาสนี้ประกอบด้วยโค้ดที่จัดการการดําเนินการสร้างสําหรับตารางเสมือน
    UpdatePlugin.cs คลาสนี้ประกอบด้วยรหัสที่จัดการการอัปเดตเรกคอร์ดในตารางเสมือน
    RetrievePlugin.cs ระดับชั้นนี้ประกอบด้วยรหัสที่ดึงข้อมูลเรกคอร์ดเฉพาะจากตารางเสมือน
    RetrieveMultiplePlugin.cs คลาสนี้ประกอบด้วยรหัสสําหรับการดึงข้อมูลหลายเรกคอร์ดจากตารางเสมือน
    DeletePlugin.cs ระดับชั้นนี้ประกอบด้วยรหัสที่ช่วยให้คุณสามารถลบเรกคอร์ดในตารางเสมือนได้

อ่านข้อมูลสําคัญต่อไปนี้เกี่ยวกับการใช้สตริงการเชื่อมต่อ หรือการรับรองความถูกต้องชื่อผู้ใช้/รหัสผ่านในรหัสแอปพลิเคชัน

สําคัญ

Microsoft แนะนําให้คุณใช้โฟลว์การรับรองความถูกต้องที่ปลอดภัยที่สุดที่พร้อมใช้งาน โฟลว์การรับรองความถูกต้องที่อธิบายไว้ในบทความนี้จําเป็นต้องมีความน่าเชื่อถือในแอปพลิเคชันในระดับสูง และมีความเสี่ยงที่ไม่ได้อยู่ในโฟลว์อื่น ๆ คุณควรใช้โฟลว์นี้เมื่อโฟลว์อื่น ๆ มีความปลอดภัยมากขึ้น เช่น ข้อมูลประจําตัวที่มีการจัดการ จะไม่สามารถทํางานได้

รหัสสําหรับ 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;
       }
   }
}

รหัสสําหรับ 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;
        }
    }
}

รหัสสําหรับ 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. 
            }
        }
    }
}

รหัสสําหรับ 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;
        }
    }
}

รหัสสําหรับ 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;
        }
    }
}

รหัสสําหรับ 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. รวบรวมและสร้างโซลูชัน ขณะนี้คุณจะมีไฟล์แอสเซมบลี (.dll) ที่คุณสามารถใช้เพื่อลงทะเบียนในสภาพแวดล้อม Dataverse ของคุณ คุณจะพบไฟล์นี้ใน โฟลเดอร์โซลูชัน/bin/Debug directory

    Assembly dll

  2. ลงทะเบียนแอสเซมบลีโดยใช้เครื่องมือการลงทะเบียนปลั๊กอิน คุณสามารถรับแพคเกจเครื่องมือการลงทะเบียนปลั๊กอินล่าสุดได้จาก NuGet

  3. เปิดเครื่องมือลงทะเบียนปลั๊กอิน คุณจําเป็นต้องมีสิทธิ์การดูแลระบบเพื่อลงทะเบียนแอสเซมบลี เลือก สร้างการเชื่อมต่อใหม่ เพื่อเชื่อมต่อกับสภาพแวดล้อม Dataverse ของคุณ เลือก ตัวเลือก รายการแบบเลื่อนลง ลงทะเบียน จากนั้นเลือก ลงทะเบียนแอสเซมบลีใหม่

    ลงทะเบียนขั้นตอนใหม่

  4. เลือกไฟล์แอสเซมบลีและลงทะเบียนปลั๊กอิน ตรวจสอบให้แน่ใจว่าคุณได้เลือกปลั๊กอินทั้งหมด (ปลั๊กอิน สร้าง อัปเดต ลบ เรียกใช้ และ RetrieveMultiple)

    ลงทะเบียนแอสเซมบลีใหม่

ขั้นตอนที่ 2: การสร้างผู้ให้บริการข้อมูลและการเพิ่มปลั๊กอินไปยังผู้ให้บริการ

  1. เลือกเมนูดรอปดาวน์ ลงทะเบียน จากนั้นเลือก ลงทะเบียนผู้ให้บริการข้อมูลใหม่

  2. ในกล่องโต้ตอบ ลงทะเบียนผู้ให้บริการข้อมูลใหม่ ให้ใส่รายละเอียดต่อไปนี้:

    1. ใส่ชื่อตัวให้บริการข้อมูล

    2. ในตัวเลือก โซลูชัน เลือกโซลูชันที่มีอยู่ หรือสร้างโซลูชันใหม่ในรายการดรอปดาวน์ ถ้าคุณต้องการสร้างโซลูชันใหม่ ให้เลือกตัวเลือก NewSolution จากรายการดรอปดาวน์ ในกล่องโต้ตอบ สร้างโซลูชันใหม่ ให้ใส่รายละเอียดที่จําเป็นและเลือก บันทึก

    3. ในตัวเลือก ตารางแหล่งข้อมูล (เอนทิตี) ให้เลือก สร้างแหล่งข้อมูลใหม่ ป้อนรายละเอียด ตรวจสอบให้แน่ใจว่าแหล่งข้อมูลเป็นส่วนหนึ่งของโซลูชันที่คุณสร้างหรือเลือก

      Note

      ตารางแหล่งข้อมูลใน Dataverse เก็บข้อมูลการกําหนดค่าสําหรับระเบียนแหล่งข้อมูลที่จะส่งผ่านไปยังปลั๊กอินของผู้ให้บริการ

    4. จับคู่แต่ละปลั๊กอินที่ลงทะเบียนกับการดำเนินการที่เกี่ยวข้อง

    5. ลงทะเบียนผู้ให้บริการข้อมูลใหม่

      ลงทะเบียนผู้ให้บริการข้อมูล

  3. ในเครื่องมือการลงทะเบียนปลั๊กอินคุณจะเห็นระเบียนแหล่งข้อมูลใหม่และผู้ให้บริการข้อมูลที่เกี่ยวข้อง การเลือกแหล่งข้อมูลจะแสดงรายละเอียดซึ่งรวมถึงปลั๊กอินและ GUID ที่ลงทะเบียนไว้

    ตัวให้บริการข้อมูลที่ลงทะเบียนไว้

ขั้นตอนที่ 3: การสร้างตารางเสมือนในสภาพแวดล้อม Dataverse

  1. สร้างแหล่งข้อมูลตารางเสมือนใหม่ โดยการนําทางไปยังการตั้งค่า>>การจัดการตารางเสมือน (เอนทิตี) แหล่งข้อมูล

  2. เลือก ใหม่ จากนั้นเลือกผู้ให้บริการข้อมูลที่คุณสร้างขึ้นในขั้นตอนก่อนหน้าจากรายการดรอปดาวน์

  3. ใส่ชื่อสําหรับแหล่งข้อมูลและเลือก บันทึกและปิด

  4. ในตอนนี้คุณก็พร้อมที่จะสร้างตารางเสมือนที่แสดงถึงแหล่งข้อมูลภายนอกแล้ว เมื่อต้องการทําเช่นนี้ไปที่การตั้งค่า>ปรับแต่งระบบ

  5. ในบานหน้าต่างนําทางด้านซ้ายของตัวสํารวจโซลูชัน เลือกตาราง (เอนทิตี) จากนั้นเลือกใหม่

  6. ป้อนรายละเอียดต่อไปนี้:

    Column คำอธิบาย
    แหล่งข้อมูล เลือกแหล่งข้อมูลที่คุณสร้างขึ้นในขั้นตอนก่อนหน้า
    ชื่อที่ใช้แสดง ชื่อตารางเสมือน
    ชื่อพหูพจน์ ค่าจะถูกเติมโดยอัตโนมัติโดยยึดตามชื่อที่แสดง
    ชื่อ ซึ่งจะถูกสร้างขึ้นโดยอัตโนมัติโดยยึดตามค่าที่คุณป้อนสําหรับชื่อที่แสดง
    ชื่อภายนอก ชื่อของตารางที่มา
    ชื่อคอลเลกชันภายนอก คุณสามารถใช้ค่าเดียวกันจากคอลัมน์ชื่อพหูพจน์ได้
  7. เลือก บันทึกและปิด

    สร้างเรกคอร์ดใหม่

  8. ในบานหน้าต่างนําทางด้านซ้าย เลือกและขยายบนตารางเสมือนที่คุณสร้างขึ้น

  9. เลือก เขตข้อมูล เพื่ออัปเดตและสร้างคอลัมน์ใหม่ที่แสดงแหล่งที่มาภายนอก

  10. เลือกคอลัมน์ คีย์หลัก สําหรับตารางเสมือน และเลือก แก้ไข

  11. อัปเดตคอลัมน์ ชื่อภายนอก ให้ตรงกับชื่อคอลัมน์ในแหล่งข้อมูลภายนอกของคุณ ในตัวอย่างนี้ ชื่อคอลัมน์ภายนอกคือ TicketID

    สร้างตารางใหม่

  12. เลือก บันทึกและปิด

  13. เลือกเขตข้อมูลชื่อสําหรับตารางเสมือน และเลือกแก้ไข

  14. อัปเดตเขตข้อมูล ชื่อภายนอก ให้ตรงกับชื่อเขตข้อมูลในแหล่งข้อมูลภายนอกของคุณ ในตัวอย่างนี้ ชื่อคอลัมน์ภายนอกคือชื่อ

    สร้างเขตข้อมูลชื่อใหม่

  15. เลือก บันทึกและปิด

  16. เลือก ใหม่ เพื่อสร้างคอลัมน์ใหม่ในตารางเสมือน คอลัมน์นี้จะแสดงคอลัมน์ความรุนแรงในแหล่งข้อมูลภายนอก

  17. ป้อนข้อมูลต่อไปนี้สําหรับคอลัมน์ใหม่:

    ชื่อคอลัมน์ ค่า
    ชื่อที่ใช้แสดง ความรุนแรง
    ชื่อ new_severity
    ชื่อภายนอก ความรุนแรง
    ข้อกําหนดของเขตข้อมูล ธุรกิจที่ต้องการ
    ชนิดข้อมูล จำนวนเต็ม

    สร้างเขตข้อมูลความรุนแรงใหม่

  18. เลือก บันทึกและปิด

ขั้นตอนที่ 4: สร้าง อัปเดต ดู และลบเรกคอร์ดโดยใช้ตารางเสมือน

สร้างแอปที่ขับเคลื่อนด้วยแบบจําลองและเพิ่มตารางเสมือนลงในแผนผังเว็บไซต์ จากนั้นเลือกฟอร์มหลักของตารางเสมือนและมุมมองเขตข้อมูลขั้นสูง เผยแพร่แอป ข้อมูลเพิ่มเติม: สร้างแอปแบบจําลองข้อมูลแรกของคุณตั้งแต่เริ่มต้น

สร้างแอปแบบขับเคลื่อนด้วยโมเดล

ผู้ใช้แอปพลิเคชันสามารถดําเนินการอ่านสร้างอัปเดตลบการดําเนินการโดยใช้ตารางเสมือนเช่นเดียวกับตารางอื่น ๆ ใน Microsoft Dataverse

ดูเพิ่มเติม

เริ่มต้นใช้งานตารางเสมือน
ข้อควรพิจารณาของ API สําหรับตารางเสมือน
ตัวให้บริการข้อมูลตารางเสมือนแบบกําหนดเอง
คําแนะนําตารางเสมือนโดยใช้ตัวให้บริการข้อมูล OData v4