You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power Platform Dataverse能否基于用户选择实现动态复合键约束?

在Power Platform Dataverse中实现基于用户选择的动态键约束

Dataverse原生复合键是静态的,无法根据字段值动态切换约束逻辑,你可以通过以下方案实现需求:

方案1:使用Dataverse插件(推荐,全场景覆盖)

通过编写C#插件在记录创建/更新前验证约束,能覆盖前端、API、批量导入等所有数据写入场景:

  1. 注册插件:将插件注册到Student表的Create和Update事件,执行阶段选择PreValidation(优先拦截违规操作)。
  2. 核心逻辑:
    • 获取当前记录的Student、Course、Lecturer字段值。
    • 若Lecturer不是"Jack":查询Dataverse中是否存在相同Student+Course的记录(更新时需排除当前记录本身),存在则抛出错误阻止保存。
    • 若Lecturer是"Jack":跳过Student+Course的唯一验证,允许同一组合创建多条记录(若需要额外约束,比如Student+Course+Unit唯一,可在此添加对应查询)。
  3. 示例代码片段:
using Microsoft.Xrm.Sdk;
using System.Linq;

public class StudentDynamicConstraintPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        var service = serviceFactory.CreateOrganizationService(context.UserId);

        if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity studentRecord)
        {
            string student = studentRecord.GetAttributeValue<string>("new_student");
            string course = studentRecord.GetAttributeValue<string>("new_course");
            string lecturer = studentRecord.GetAttributeValue<string>("new_lecturer");

            var query = new QueryExpression("new_student")
            {
                ColumnSet = new ColumnSet("new_studentid"),
                Criteria = new FilterExpression
                {
                    Conditions = 
                    {
                        new ConditionExpression("new_student", ConditionOperator.Equal, student),
                        new ConditionExpression("new_course", ConditionOperator.Equal, course)
                    }
                }
            };

            // 更新操作时排除当前记录
            if (context.MessageName == "Update")
            {
                query.Criteria.Conditions.Add(new ConditionExpression("new_studentid", ConditionOperator.NotEqual, context.PrimaryEntityId));
            }

            // 非Jack讲师时验证唯一性
            if (lecturer != "Jack")
            {
                var existingRecords = service.RetrieveMultiple(query);
                if (existingRecords.Entities.Any())
                {
                    throw new InvalidPluginExecutionException($"学生「{student}」已选过课程「{course}」,无法重复添加");
                }
            }
        }
    }
}

方案2:使用Power Automate(无代码方案)

适合非开发人员,通过流实现前端场景的约束:

  1. 创建自动化流,触发条件为当Dataverse记录被创建或更新时,指向Student表。
  2. 添加获取行动作,设置查询条件:
    • 当触发记录的Lecturer不等于"Jack"时,查询Student等于当前记录Student且Course等于当前记录Course的记录(更新时需添加条件排除当前记录ID)。
  3. 添加条件判断:如果获取行返回的记录数大于0,则执行以下操作:
    • 删除刚创建/更新的违规记录。
    • 向用户发送通知,说明违规原因(如"该学生已选过此课程,记录已被删除")。

方案3:使用业务规则(前端辅助验证)

仅能在表单前端给出提示,无法阻止API或批量导入的违规操作,适合作为辅助验证:

  1. 在Student表新建业务规则。
  2. 添加条件:Lecturer不等于"Jack",且存在其他记录的Student等于当前Student且Course等于当前Course。
  3. 执行动作:显示错误消息(如"该学生已选过此课程,请修改"),并禁用表单的保存按钮。

内容的提问来源于stack exchange,提问作者liam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:14:54