【问题标题】:Is this type assignment error a bug in WCF or Windows Workflow Foundation 4.5?这种类型分配错误是 WCF 或 Windows Workflow Foundation 4.5 中的错误吗?
【发布时间】:2014-02-11 20:16:15
【问题描述】:

我有一个 Windows Workflow Foundation 4.5 WCF 工作流服务应用程序。我正在尝试从我的CodeActivity<Dictionary<IEdmEntityType, DataTable>> 返回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&lt;..&gt;被分配给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&lt;TKey, TValue&gt; 声明为任何接口时,工作流程可能不会很好。我做了一个测试用例,它工作得很好。我还按顺序将该步骤添加到设计器中,就像这里所做的那样。我没有尝试将IEdmEntityType 用作TKey,但我看不出它为什么会有任何不同。

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

编辑#1

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

似乎没有Dictionary&lt;TKey, DataTable&gt; 可以通过设计器在WF 4.5 中传递。

编辑#2

它似乎与DataTable 有任何关系,也可能没有任何关系。你也不能绕过Dictionary&lt;IEdmEntityType, object&gt;

为了尝试在System.DataSystem.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;
    }
}

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

另外,我让MyClassComplex 继承自MarshalByValueComponent,没有奇怪的交互,也没有再次出现错误。

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

编辑#3

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

【问题讨论】:

    标签: c# xaml workflow-foundation workflow-foundation-4.5


    【解决方案1】:

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

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

    【讨论】:

    • 该死的,昨天遇到了同样的错误,但是传递了一个JObject。烦人。
    【解决方案2】:

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

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

    我们已经解决了手动修改 .xaml 从分配活动中的目标和源变量中的 x:Object 到 x:Double 的问题。

    【讨论】:

    • 似乎发生在任何类型。
    • 是的,任何类型。烦人的错误。真烦人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2016-10-18
    • 2017-04-17
    相关资源
    最近更新 更多