4

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

选择 Mandatory 标志不会使其成为 NON-NULL。

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

4

2 回答 2

2

很抱歉,根本没有支持的方式来执行此操作(“支持”==“SDK 中存在”)。

如果没有很多可怕的黑客攻击(删除属性及其依赖项,重新创建它以禁止 NULL 然后将其重新插入),您甚至无法在 SQL 级别执行任何操作,这甚至可能无法正常工作。

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

于 2012-06-15T09:20:42.810 回答
1

虽然不完全符合您的要求,但您可以通过 API 实现类似的效果。在预验证阶段编写一个针对Createand的插件(以在数据库事务之前捕获值)。如果不可为空的属性永远为空,则抛出异常,这将完全取消事务。Updatenull

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

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.");
            }
        }
    }
}
于 2012-06-15T19:41:18.790 回答