WCF数据服务反射提供程序指定关联类型

时间:2012-07-11 15:18:50

标签: reflection wcf-data-services odata visual-studio-lightswitch

我一直在努力尝试使用新的LightSwitch 2.0 OData数据源来使用Data Services。 注意到OData 3.0仍然不受支持我不得不回到2.0版本。

碰巧我的数据上下文只是一些xml序列化对象的包装,以启用OData访问。 这种“魔法”使用Reflection Provider发生,并且对于所有CRUD操作都可以正常工作。

当我尝试在LightSwitch中使用此服务时,问题就开始了,并且意识到我的所有实体关联都是错误的。

我所拥有的情况与您查看Microsoft的sample code

完全相同

所以,使用这个数据模型:

[DataServiceKeyAttribute("OrderId")]
public class Order
{
    public int OrderId { get; set; }
    public string Customer { get; set; }
    public IList<Item> Items { get; set; }
}
[DataServiceKeyAttribute("Product")]
public class Item
{
    public string Product { get; set; }
    public int Quantity { get; set; }
}

显然,订单[1 - *]项目之间的“一对多”关系。 但是查看此服务的xml元数据,该关联被声明为“多对多”:

<Association Name="Order_Items">
    <End Type="WEBfactory.StreamInsight.Adapters.Carel.DataServices.Order" Multiplicity="*" Role="Order"/>
    <End Type="WEBfactory.StreamInsight.Adapters.Carel.DataServices.Item" Multiplicity="*" Role="Items"/>
</Association>

现在,当使用“服务引用”客户端时,这并没有太多麻烦,但由于LightSwitch不支持“多对多”关系,因此在尝试使用此服务时我总是会收到警告,并且关系是既不导入也不可能手动定义。

有没有人知道如何使用Reflection Provider强制执行关系类型?

谢谢!

2 个答案:

答案 0 :(得分:1)

在这种情况下,Order和Item之间的关系实际上很多:很多 - 如果它是1:很多,如你所说,一个Item只能在一个订单中。

也就是说,您可以通过向Item类添加相应的属性来创建1:*关系:

[DataServiceKeyAttribute("Product")]
public class Item
{
    public string Product { get; set; }
    public int Quantity { get; set; }
    public Order Order { get; set; }
}

这导致以下$元数据,这可能会也可能不会导致同样的问题:

<Association Name="Order_Items">
  <End Type="Scratch.Web.Order" Multiplicity="*" Role="Order"/>
  <End Type="Scratch.Web.Item" Multiplicity="*" Role="Items"/>
</Association>
<Association Name="Item_Order">
  <End Type="Scratch.Web.Order" Multiplicity="0..1" Role="Order"/>
  <End Type="Scratch.Web.Item" Multiplicity="*" Role="Item"/>
</Association>

这可能是Reflection提供程序的限制(如果事实证明不是,我会编辑此答案),因此今天唯一的解决方法是使用EF提供程序或自定义提供程序。

答案 1 :(得分:0)

我会按照此处的说明使我的WCF RIA服务正常工作: 如何创建多对多关系 http://blogs.msdn.com/b/lightswitch/archive/2010/12/16/how-to-create-a-many-to-many-relationship-andy-kung.aspx