从控制台应用程序查询实体时绕过插件

时间:2012-11-26 20:09:29

标签: dynamics-crm-2011

我的插件加密/解密字段。在CRM表单中的字段上工作。

从我的控制台应用程序中,检索绕过我的插件,例如,它直接从数据库检索加密值而不运行插件。在调试时,从表单访问字段时会触发插件中的断点,但从我的控​​制台程序访问时不会触发它们。

我很惊讶我的插件没有从程序中调用。它绕过了我的业务规则。

以下是我如何通过程序访问实体和字段:

    private static OrganizationServiceProxy service = null;
    private static OrganizationServiceContext orgSvcContext = null;
    public static void RetrieveSSNs()
    {
        var query = orgSvcContext.CreateQuery("bpa_consumer");
        foreach (Entity consumer in query)
        {
            if (consumer.Attributes.Contains("bpa_ssn"))
            {
                string ssn = consumer["bpa_ssn"].ToString();
                Console.WriteLine(string.Format("Consumer \"{0}\" has SSN {1}", consumer.Attributes["bpa_name"], ssn));
            }
            else
            {
                Console.WriteLine(string.Format("Consumer \"{0}\" doesn't have a SSN", consumer.Attributes["bpa_name"]));
            }
        }
    }

3 个答案:

答案 0 :(得分:3)

我猜你在Retrieve方法上注册了插件?如果是这样,请在RetrieveMultiple上添加另一个相同的注册。这应该让你的插件在你的foreach上执行。我应该警告你,从表演的角度来看,这是一件极其危险的事情......

答案 1 :(得分:0)

如果您担心性能,我的建议是将加密数据放入一个单独的实体中并进行查找。使用此方法,CRM只需在用户需要访问加密数据时执行Retrieve / RetrieveMultiple插件,而不是每次用户访问主记录时都执行。这样也可以更容易地保护加密数据。

答案 2 :(得分:-1)

当您查询实体集合时,您必须为事件RetrieveMultiple注册插件。