3

我有一个 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的返回值。ExecuteCodeActivity<..>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为任何接口。我做了一个测试用例,它工作得很好。我还按顺序将该步骤添加到设计器中,就像这里所做的那样。我没有尝试使用IEdmEntityTypeas the TKey,但没​​有理由,我可以看到,为什么它应该有所不同。

这可能是什么原因,我该如何解决?

编辑#1

进一步的研究表明,这DataTable是罪魁祸首。DataSet也有问题。我能看到这些类型的唯一独特之处是它们继承自MarshalByValueComponent其中具有 a TypeConverterAttribute。这TypeConverter可能会影响 XAML 序列化绑定程序并导致问题,因此表明 WF 4.5 中存在错误。但是,我不敢说这是一个错误。

Dictionary<TKey, DataTable>似乎不能通过设计器在 WF 4.5 中传递。

编辑#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具有自动属性和对 an 的引用object也有效。

public class MyClassComplex
{
    public int A
    {
        get;
        private set;
    }

    public int B
    {
        get;
        private set;
    }

    public object C
    {
        get;
        private set;
    }
}

本来我也觉得可能和 and 之间的共同属性有关系DataTableDataSet所以我把它们加到了 中MyClassComplex,但还是没问题。

此外,我MyClassComplex继承自MarshalByValueComponent,并且没有奇怪的交互,再次没有错误。

我采用了同一个项目,只是将我的变量设置为 aDictionary<IMyInterface, DataTable>并将其更改CodeActivity<IMyInterface, MyClassComplex>CodeActivity<IMyInterface, DataTable>,它给出了与我原来的非测试项目中相同的错误。

编辑#3

由于我已经对此进行了测试并在单独的项目和同事的机器上重现了该问题,并且没有文档支持为什么这不起作用,因此我已在 MS Connect 上提交了错误报告

4

2 回答 2

3

显然,Windows Workflow Foundation 包含特定版本Microsoft.Data.OData的 ODataLib NuGet 包并将其添加到与该项目冲突的项目中。我四处搜索最初包含引用的位置,结果发现它是在代码生成期间作为工作流设计者代码生成过程的一部分默默添加的。

客户端从来没有任何错误表明某些程序集版本冲突。据我所知,没有办法解决这个问题。微软已经“按设计”关闭了罚单。

于 2014-03-09T07:06:32.593 回答
1

只是为了简化情况,如果您尝试将双精度值/变量分配给双精度变量,也会发生这种情况。它在 4.5 之前可以工作,但现在不行。

未触及的 Wf 定义只是停止工作升级框架。

我们已经解决了它在 Assign 活动中将 Target 和 Origin 变量中的 .xaml 从 x:Object 手动修改为 x:Double 的问题。

于 2015-02-18T16:37:39.947 回答