2

我一直在努力嘗試讓Data Services與新的LightSwitch 2.0 OData數據源一起工作。 注意到OData 3.0仍然不受支持我必須回退到2.0版本。WCF數據服務反射提供商指定關聯類型

碰巧我的數據上下文只不過是封裝了一些xml序列化對象來啓用OData訪問。 這個「神奇」使用Reflection Provider發生,並且它在所有CRUD操作中都正常工作。

當我嘗試在LightSwitch中使用此服務並意識到我的所有實體關聯都是錯誤時,問題就開始了。

我擁有的情況與您看微軟的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不支持「多對多」關係,因此嘗試使用此服務時總會收到警告,並且關係既不導入也不可能手動定義。

有沒有人有線索如何使用反射提供程序工作強制關係類型?

謝謝!

回答

1

在這種情況下,訂單和項目之間的關係,實際上是多比多 - 如果它是1:很多,如你所建議的,一個項目只能在一個訂單。

這就是說,你可以創建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> 

這可能是反射提供商的限制(如果它原來不被我將修改這個答案),所以今天唯一的解決方法是爲使用的EF提供商或自定義提供。

+0

嗨馬克,你是對的,在Item類中沒有任何跡象表明它只包含一個Order,無論如何,在改變它之後,你仍然可以看到元數據中的多對多關係,並且這會導致LightSwitch警告不支持的關係。 我找到的解決方案使用此方法,並配合使用IgnorePropertiesAttribute刪除LightSwitch警告。 – 2012-07-12 12:45:53