0

我有一个类型为“文件”的自定义属性,我需要通过插件删除该文件。我检查了位于此处的文档:https ://docs.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 中没有找到此请求的任何示例,所以如果有人对此有任何经验 - 请分享。谢谢你。

4

3 回答 3

0

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

于 2021-03-16T14:00:01.817 回答
0

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

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

        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 更改时,上传和删除都触发在文件字段上注册的插件。

于 2022-03-02T21:20:08.797 回答
0

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

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

DeleteFileResponse deleteFileResponse = (DeleteFileResponse)organizationService.Execute(deleteFileRequest);
于 2021-08-09T12:15:36.573 回答