我有一个简单的SharePoint 2010 BCS解决方案,其中我定义了两个实体以及它们之间的简单父子关系。我碰巧在一个独立于服务类(ParentService
和ChildService
)的程序集中有实体类(Parent
和Child
)。当只使用Finder和SpecificFinder方法时,这似乎不会带来问题,但当我尝试执行AssociationNavigator方法时,它会失败。当我的实体类型与BCS模型定义位于同一部件中并关联服务类时,AssociationNavigator工作正常。我这样称呼AssociationNavigator:
var entity_instance_collection = new EntityInstanceCollection(1);
entity_instance_collection.Add(parent_entity_instance);
var association = (IAssociation)parent_entity.GetMethodInstance("ParentToChildAssociationNavigator", MethodInstanceType.AssociationNavigator);
var child_items = child_entity.FindAssociated(entity_instance_collection, association, lobi);
当实体类型在单独的程序集中时,我在尝试执行FindAssociated
:时会得到InvalidMetadataObjectException
无法加载TypeDescriptor TypeName描述的类型名为的参数的"BdcModelProject2.BdcModel1.Parent,BdcModel1"实体上名为"ReadItem"的方法的"parent"(外部内容命名空间"BdcModelProject2.BdcModel1"中名为"Parent"的)。
使用此InnerException:
未能从程序集中加载类型"BdcModelProject2.BdcModel1.Parent"'BdcModelProject2,版本=1.0.0.0,区域性=中性,PublicKeyToken=50bc5a1f7318bdeb'。
因此,我的应用程序似乎只是试图从定义BCS模型的程序集(BdcModelProject2)加载我的实体类型,而不是从实际定义实体的程序集中(ClassLibrary1)加载。我对此有几点困惑:
- 我看到BCS模型在TypeDescriptor中有TypeName属性,这些TypeDescriptor描述了实现实体类的类的类型,但Finder和SpecificFinder方法似乎对我来说运行正常,即使这里提供了胡言乱语,但AssociationNavigator无法加载类型。为什么会这样
- 在Visual Studio生成的bdcm文件或MSDN文档中,我看不到TypeDescriptor的任何位置指示可以为实体类型指定程序集名称
那么,当实体类型在不同的程序集中定义时,我如何在BCS项目中使用这些实体类型呢?
这里有两种可能性:
- 它找不到dll
- 它找到一个旧版本的dll,该dll不包含您正在使用的新代码
我们经常遇到一个问题,即广汽中有一个旧版本。当一个新版本安装在bin目录中时,它会忽略它并继续使用GAC中的版本。然后删除GAC中的版本,但它仍然不起作用,因为它已经缓存了旧版本。最后,IIS重置或机器重新启动使其工作。
简短回答:尝试在计算机上查找旧版本的dll。
编辑
您可以使用程序集绑定日志查看器之类的工具来跟踪问题。
请参阅:http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.90).aspx