我有一个Windows Workflow Foundation 4.5 WCF工作流服务应用程序。我正在尝试从Dictionary<IEdmEntityType, DataTable>
返回CodeActivity<Dictionary<IEdmEntityType, DataTable>>
。代码不会遇到编译时错误,但XAML无法编译。
我的XAML的相关部分是这样的:
我们有序列的变量声明,我试图转储我的返回值。我们尝试分配的变量称为EntityTableRelationships
。
<p1:Sequence.Variables>
<p1:Variable x:TypeArguments="x:String" Name="MetadataContent" />
<p1:Variable x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)" Name="EntityTableRelationships" />
</p1:Sequence.Variables>
还有OutArgument
,Execute
的返回值,我们的CodeActivity<..>
被分配到EntityTableRelationships
。
<o:TransformMetadataToTables.Result>
<p1:OutArgument x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)">
<mca:CSharpReference x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)">EntityTableRelationships</mca:CSharpReference>
</p1:OutArgument>
</o:TransformMetadataToTables.Result>
正在生成的XAML验证错误是:
Type 'http://schemas.microsoft.com/netfx/2009/xaml/activities:OutArgument(Dictionary)' is not assignable to type 'http://schemas.microsoft.com/netfx/2009/xaml/activities:OutArgument(Dictionary)' of member 'EntityTableRelationships'.
最初我以为我错误地键入了我的返回值,或者我引用了一个名称相同但位于不同名称空间的接口。事实并非如此。
我的另一个想法是,任何Dictionary<TKey, TValue>
声明TKey
作为任何界面,工作流程可能不会很好。我做了一个测试案例,它做到了这一点并且运行良好。我还将这一步添加到设计器中并按顺序添加,就像在此处所做的那样。我没有使用IEdmEntityType
作为TKey
进行尝试,但没有理由,我可以看到,为什么它应该有所不同。
这可能是什么原因以及如何解决?
编辑#1
进一步的研究表明,DataTable
是罪魁祸首。 DataSet
也有问题。我唯一可以看到的是这些类型的独特之处在于它们继承自MarshalByValueComponent
,其上有TypeConverterAttribute
。 TypeConverter
可能会影响XAML序列化绑定器并导致问题,从而表明WF 4.5中存在错误。但是,我犹豫是否说这是一个错误。
似乎可以通过设计师在WF 4.5中传递Dictionary<TKey, DataTable>
。
编辑#2
似乎它可能与DataTable
有关,也可能没有任何关系。你也无法传递Dictionary<IEdmEntityType, object>
。
为了尝试使用System.Data
以外的类而不是System.Object
重现问题,我制作了一个新的工作流程项目。
我创建了自己的界面,类和结构,以查看是否有任何东西会触发它再次破坏。
我没有使用IEdmEntityType
,而是将IMyInterface
定义为:
public interface IMyInterface
{
int Id
{
get;
}
}
MyStruct
结构正常工作。这是定义:
public struct MyStruct
{
public int A;
public int B;
}
MyClass
课程运作良好。这是定义:
public class MyClass
{
public int A;
public int B;
}
带有自动属性的 MyClassComplex
和对object
的引用也有效。
public class MyClassComplex
{
public int A
{
get;
private set;
}
public int B
{
get;
private set;
}
public object C
{
get;
private set;
}
}
我原本以为它可能与DataTable
和DataSet
之间的公共属性有关,所以我将它们添加到MyClassComplex
,但它仍然可以正常工作。
此外,我MyClassComplex
继承了MarshalByValueComponent
,并且没有奇怪的互动,也没有再次出错。
我使用了同一个项目,只需将我的变量设置为Dictionary<IMyInterface, DataTable>
,并将CodeActivity<IMyInterface, MyClassComplex>
更改为CodeActivity<IMyInterface, DataTable>
,它会产生与原始非测试项目相同的错误。
编辑#3
由于我已经对此进行了测试并在单独的项目和同事的机器上重现了该问题,并且没有文档支持为什么这不起作用,我已经提交了bug report on MS Connect
答案 0 :(得分:3)
显然,Windows Workflow Foundation包含特定版本的Microsoft.Data.OData
,并且将ODataLib NuGet包添加到项目与之冲突。我搜索了最初包含引用的位置,事实证明它是在代码生成期间默默添加的,作为工作流设计器代码生成过程的一部分。
在客户端没有任何错误表明某些程序集版本冲突。据我所知,没有办法解决这个问题。微软已经将该机票关闭为“按设计”。
答案 1 :(得分:1)
为了简化这种情况,如果您尝试将double value / variable赋值给double变量,也会发生这种情况。它在4.5之前工作但现在却没有。
未触及的Wf定义只是停止升级框架。
我们已经解决了手动修改.xaml从x:Object到x:来自Assign活动的Target和Origin变量的双倍。