如何创建不可为空的 CRM 基本类型,如 int 或 double
本文关键字:CRM 类型 double int 何创建 创建 | 更新日期: 2023-09-27 18:36:56
当我们在Microsoft Dynamics CRM中创建新字段时,它将在允许NULL
的情况下在数据库中创建该字段。如何在CRM中创建NON-NULL
在后备数据库中的字段,就像他们用于自己的某些字段一样?
选择"必需"标志不会使其变为非 NULL。
提问理由:当使用 LINQ 针对 CRM 进行编程时,当您必须处理可为空的查询时,许多查询变得相对困难,有些甚至变得不可能,例如聚合查询(尝试 Max()
,当底层数据库类型可为空时,它会给出一个InvalidCastException
)。
很抱歉,根本没有支持的方法("支持" == "存在于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.");
}
}
}
}