如何创建不可为空的 CRM 基本类型,如 int 或 double

本文关键字:CRM 类型 double int 何创建 创建 | 更新日期: 2023-09-27 18:36:56

当我们在Microsoft Dynamics CRM中创建新字段时,它将在允许NULL的情况下在数据库中创建该字段。如何在CRM中创建NON-NULL在后备数据库中的字段,就像他们用于自己的某些字段一样?

选择"必需"标志不会使其变为非 NULL。

提问理由:当使用 LINQ 针对 CRM 进行编程时,当您必须处理可为空的查询时,许多查询变得相对困难,有些甚至变得不可能,例如聚合查询(尝试 Max() ,当底层数据库类型可为空时,它会给出一个InvalidCastException)。

如何创建不可为空的 CRM 基本类型,如 int 或 double

很抱歉,根本没有支持的方法("支持" == "存在于SDK中")。

如果没有很多可怕的黑客攻击,你甚至无法在SQL级别做任何事情(删除属性及其依赖项,重新创建它以禁止NULL,然后将其重新探测),这甚至可能不起作用。

我认为正确的方法是克服您的 LINQ 问题。这不是解决方案吗?

虽然不完全是你想要的,但你可以通过API实现类似的效果。针对Create编写插件,并在预验证阶段Update(以便在数据库事务之前捕获null值)。如果不可为空的属性为 null,则引发异常,这将完全取消事务。

如果您在创建记录注册插件,那么您只需要确保用值填充这些预先存在的记录。

public void Execute(IServiceProvider serviceProvider)
{
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
    {
        var target = ((Entity)context.InputParameters["Target"]);
        if (target.LogicalName == Appointment.EntityLogicalName)
        {
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            var entity = target.ToEntity<Xrm.Appointment>();
            if (entity.Description == null && entity.Attributes.Contains("description"))
            {
                throw new Microsoft.Xrm.Sdk.SaveChangesException("Fill in the field, buddy.");
            }
        }
    }
}