2

我一直在努力尝试让数据服务与新的 LightSwitch 2.0 OData 数据源一起工作。注意到 OData 3.0 仍然不受支持,我不得不退回到 2.0 版本。

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

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

我的情况和你看微软的示例代码一模一样。

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

[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; }
}

很明显 Order [1 - *] Items 之间的“一对多”关系。但是查看该服务的 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 不支持“多对多”关系,我在尝试使用此服务时总是会收到警告,并且关系既不导入,也不可能手动定义。

有没有人知道如何使用反射提供程序强制执行关系类型?

谢谢!!

4

2 回答 2

1

在这种情况下,Order 和 Item 之间的关系实际上是 many:many - 如果按照您的建议是 1:many,则 Item 只能在一个 Order 中。

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

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

这会产生以下 $metadata,它可能会也可能不会导致相同的问题:

<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>

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

于 2012-07-11T22:30:14.627 回答
0

我会让我的 WCF RIA 服务按此处所述工作:如何创建多对多关系 http://blogs.msdn.com/b/lightswitch/archive/2010/12/16/how-to-create-多对多关系andy-kung.aspx

于 2012-07-11T16:16:18.480 回答