我一直在努力尝试使用新的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强制执行关系类型?
谢谢!
答案 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