Archive

Archive for June, 2021

Power Platform | 2021 Wave 1 | Features

With 2021 Wave 1, lots of new features introduced across the Power Platform (i.e., Power BI, Power Apps, Power Automate, and Power Virtual Agents) and the two add-ins (i.e., AI Builder and Power Apps portals).

2021 Release Wave 1 Plan, contain the features releasing from April 2021 through September 2021. Features list can be downloaded from here.

In this article, lets see the few key features/enhancements included in this release.

Dependent assemblies for plug-ins:

  • Plug-in developers have long used an unsupported capability provided by the ILMerge utility to combine a plug-in assembly plus any needed dependent assemblies together into a single .NET assembly.
  • The dependent assemblies capability provides a supported way for developers to include additional dependent assemblies along with the plug-in assembly when registering a plug-in.

Plug-in telemetry with Application Insights integration:

  • Customers who have associated their Environment with their Application Insights resource can view telemetry for log events written from their plug-in code.
  • ILogger is a standard interface for writing log events.
  • ILogger interface enables writing log events for a set of log levels, such as Trace, Debug, Information, Warning, Error.
  • The developer doesn’t need to configure or include Application Insights SDK assemblies because everything is already set up.

Advanced lookup:

Multi-table lookups:

  • If you are familiar with data type Customer, which connects to both Account and Contact, its Multi-table lookup.
  • Multi-table lookup type columns allow a user to employ a specific table that has multiple one-to-many (1:M) relationships to other tables in the environment. A single lookup type column can refer to multiple other tables.
  • This new feature gives users the power to define any other multi-table lookups they may need.

Removing business units from security role assignments:

  • Business units can be removed from a user’s security role assignment for ease of use and to simplify the business unit security model.
  • By decoupling a user’s business unit from their security role’s business unit, they can be assigned security roles from different business units. This allows the user to access the respective business units without the need to create and join the owner team.

Virtual Connector Provider for tabular connectors:

  • As we know, Virtual tables (Formerly known as ‘Virtual Entity’) enable the integration of external enterprise data with Microsoft Dataverse without the need for data duplication.
  • With the introduction of the Virtual Connector Provider for Dataverse, data residing outside of Microsoft Dataverse can be easily represented and used as Microsoft Dataverse virtual tables using supported tabular connectors (for example, SQL Server, OneDrive, Excel, SharePoint, and more).

Model-driven app adds in-app notifications:

  • In-app notifications in model-driven apps are shown to users as a notification or in the notification center.
  • Notifications are directed to a specific user and can be sent through external systems, Power Automate, or from within the system.

Power Apps component framework for canvas app:

  • Public preview of Power Apps component framework allows developers and makers to add datasets and test their custom components in canvas apps, taking advantage of the growing list of supported framework APIs.
  • Pro-dev extensibility on a low-code platform opens up possibilities enabling the best of both worlds.

Link a Microsoft Dataverse environment to Azure Synapse Analytics workspace and bring Dynamics 365 data to Azure:

  • With this feature, you can use Export to Data Lake to link a Microsoft Dataverse environment to Azure Synapse Analytics workspace and bring Dynamics 365 data that’s stored in Microsoft Dataverse to Azure.
  •  It enables a seamless integration with Azure Synapse, which provides the necessary compute to analyze data in the Data Lake using features, such as SQL on-demand.
  • These features provide a familiar T-SQL syntax to query data in the Data Lake without the need to copy or load data into a specialized store.

Auditing enhancements:

The following changes have been made to Auditing:

  • Audit data is stored in log storage.
  • Administrators can set a retention period for audit data.
  • Expired data will automatically be removed from the system per the retention period.
  • Joining entities from the database storage and the log storage will no longer be possible.

Bypass Custom Business Logic:

  • Refer my previous article on this feature.

🙂

Categories: PowerApps Tags: ,

Dataverse | Bypass Custom Business Logic

There are times when you want to be able to perform data operations without having custom business logic applied. Especially during complex data migration scenarios, we would not want our custom business logic (i.e., Sync Plug-ins/Real time Workflows) to be triggered.

The manual option to disable custom logic is,

  • We have to locate and disable the custom plug-ins. But this means that the logic will be disabled for all users while those plug-ins are disabled. It also means that you have to take care to only disable the right plug-ins and remember to re-enable them when you are done.

Now using BypassCustomPluginExecution option we can disable custom business logic programmatically.

About BypassCustomPluginExecution:

When you send requests that bypass custom business logic, all synchronous plug-ins and real-time workflows are disabled except:

  • Plug-ins which are part of the core Microsoft Dataverse system or part of a solution where Microsoft is the publisher.
  • Workflows included in a solution where Microsoft is the publisher.

There are two requirements:

  • You must send the API requests using the BypassCustomPluginExecution option.
  • The user sending the requests must have the prvBypassCustomPlugins privilege. By default, only System administrator’s have this privilege
    • The prvBypassCustomPlugins is not available to be assigned in the UI at this time. We can add a privilege to a security role using the API.

Using BypassCustomPluginExecution:

  • Web API:
    • Pass MSCRM.BypassCustomPluginExecution : true as a header in the request.
POST https://yourorg.api.crm.dynamics.com/api/data/v9.1/accounts HTTP/1.1
MSCRM.BypassCustomPluginExecution: true
Authorization: Bearer [REDACTED]
Content-Type: application/json
Accept: */*

{
  "name":"Test Account"
}
  • Organization Service:
    • Set BypassPluginExecution to true at the service, it will remain set for all requests sent using the service until it is set to false.
var svc = new CrmServiceClient(conn);

svc.BypassPluginExecution = true;

var account = new Entity("account")
{
    Attributes = {
        { "name", "Test Account" }
    }
};

svc.Create(account);
  • At Request class level:
    • BypassPluginExecution parameter, which is Optional, must be applied to each request individually.
    • You cannot use this with the 7 other IOrganizationService Methods, such as Create, Update, Delete.
    • You can use this method for data operations you initiate in your plug-ins.
var svc = new CrmServiceClient(conn);

var account = new Entity("account")
{
    Attributes = {
        { "name", "Test Account" }
    }
};

var createRequest = new CreateRequest
{
    Target = account
};

createRequest.Parameters.Add("BypassCustomPluginExecution", true);

svc.Execute(createRequest);

Adding the prvBypassCustomPlugins privilege to another role:

  • Because the prvBypassCustomPlugins is not available in the UI to set for different security roles, if you need to grant this privilege to another security role you must use the API.
  • The prvBypassCustomPlugins privilege has the id 148a9eaf-d0c4-4196-9852-c3a38e35f6a1 in every organization.
  • Code Snippet:
var roleId = new Guid(<id of role>);

service.Associate(
    "role",
    roleId,
    new Relationship("roleprivileges_association"),
    new EntityReferenceCollection {
        {
            new EntityReference("privilege", new Guid("148a9eaf-d0c4-4196-9852-c3a38e35f6a1"))
        }
    }
);

Refer Docs article for more details.

🙂