繁体   English   中英

动态客户关系管理。 删除类型为“文件”的字段中的值

[英]Dynamics CRM. Delete value in field with type 'File'

我有一个类型为“文件”的自定义属性,我需要通过插件删除该文件。 我检查了位于此处的文档: https://learn.microsoft.com/en-us/powerapps/developer/data-platform/file-attributes并且它说对于 .net 我必须使用DeleteFileRequest 我检查了此请求的文档,看起来它需要文件 ID,但我不确定从哪里可以获得它。 我尝试在 ParameterCollection 中传递参数,类似于下载请求,但它不是这样工作的:

var req = new DeleteFileRequest()
            {
                Parameters = new ParameterCollection()
                {
                    new KeyValuePair<string, object>("Target",  new EntityReference("xxx_entityName", locId)),
                    new KeyValuePair<string, object>("FileAttributeName",  "xxx_attributeName")
                }
            };

未在 Google 中找到此请求的任何样本,因此如果有人对此有任何经验 - 请分享。 谢谢你。

这个线程很老,但答案不是那么准确:首先,如果你用 oData 查看包含文件字段的实体,你会发现文件字段包含一个 Guid(还有第二个 _name 字段文件名)。 但是至少 spkl 不会为文件字段生成早期绑定。 所以第一个发现是:您需要访问字段 LateBound 并且包含的数据类型是 Guid:此代码将起作用: myEntity.GetAttributeValue<Guid>("<filefieldname>");

现在 Waleeds 代码可以工作了,我将它包装在一个扩展 function 中,以免扰乱我的逻辑:

        public static void DeleteFile(this Entity entity, string fieldName, IOrganizationService service)
        {
            if (!entity.Contains(fieldName))
                return;

            var fileId = entity.GetAttributeValue<Guid>(fieldName);
            if (fileId == Guid.Empty)
                return;

            DeleteFileRequest deleteFileRequest = new DeleteFileRequest()
            {
                FileId = fileId
            };

            service.Execute(deleteFileRequest);
        }

最后在我的代码解析完文件后调用它:

var fileIdEntity = Service.Retrieve(target.LogicalName, target.Id, new Microsoft.Xrm.Sdk.Query.ColumnSet(fieldname)).GetAttributeValue<Guid>(fieldname);
//Downloading and Parsing here
fileIdEntity.DeleteFile(fieldname, Service);

顺便说一句:当文件字段中的 Guid 发生变化时,上传和删除都会触发在文件字段上注册的插件。

我能够获得 DeleteFileRequest 所需的文件 ID (GUID)。 它在文件上传期间呈现在文件属性中的目标实体中。 所以在ModifiedOn注册的插件中(不能使用File字段作为触发器),可以在file字段中看到ID。 您可以将其保存在某个地方以备后用。 不幸的是,仍然不确定如何为已上传的文件获取它。 如果你知道怎么做,请分享你的想法。

您可以从 CRM 组织服务 object 中的简单 Retrieve 或 RetrieveMultiple 消息请求中简单地获取文件 GUID,检索它后,您可以简单地进行以下 deleteFileRequest:

DeleteFileRequest deleteFileRequest = new DeleteFileRequest()
{
    FileId = new Guid(entityResult.Entities[0].Attributes["FieldLogicalName"].ToString())
};

DeleteFileResponse deleteFileResponse = (DeleteFileResponse)organizationService.Execute(deleteFileRequest);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM