2009-10-22 33 views
1

我的EF模型是從我的SQL Server數據庫生成的。然後我爲EF模型生成了一個針對RIAServices的DomainService。其中一個實體被稱爲「EntryCategories」。在創建的DomainService這種方法:手工構建的RIAServices不受支持的類型DomainService

public IQueryable<EntryCategories> GetEntryCategoriesSet() 
{ 
    return this.Context.EntryCategoriesSet; 
} 

由於我的用戶界面顯示模式看起來與物理模型完全不同,我決定寫我自己的DomainService對於和相關實體。是的,我知道我們要修改生成的內容,但它裏面有很多東西,我想專注於一件小事。

我除去從所生成的DomainService的EnableClientAccess屬性並增加了一個稱爲ClientDomainService新的類,並且在它包封所生成的DomainService:

[EnableClientAccess()] 
public class ClientDomainService : DomainService 
{ 
    // the generated domain service encapsulated in my new one. 
    private DataDomainService _dcds = new DataDomainService(); 

    // reimplement one of the DataDomainService methods 
    public IQueryable<EntryCategories> GetEntryCategories() 
    { 
     return (from t in _dcds.GetEntryCategoriesSet() where t.EntryCategoriesVersions.EntryCategoriesVersionId == datahead.EntryCategoriesVersions.EntryCategoriesVersionId orderby t.DisplayOrder select t); 
    } 
} 

我嘗試的非常拳頭的是要重新實現GetCateogoriesSet方法但基礎數據是根據我班的另一個實體(未顯示)過濾的。但是,當我建立這個,一個錯誤顯示出來:

Entity 'DataProject.Web.EntryCategories' has a property 'EntryCategoriesVersionsReference' with an unsupported type 

如果我註釋掉我CientDomainService,更換所產生的DomainService的EnableClientAccess屬性,並把analagous LINQ過濾原GetEntryCategoriesSet方法,項目編譯沒有錯誤。

生成的DomainService對我的新服務沒有什麼特別之處?它是metadata.cs文件嗎?

回答

0

如果您想公開某個域服務上的特定實體,您必須爲其提供至少一種查詢方法。當實體只作爲另一個實體的孩子被訪問時,這也是必需的。

在這種情況下,您需要將EntryCategoriesVersions實體集添加到域服務,以使場景正常工作。

4

生成的域服務的特殊之處不在於.metadata.cs文件(您可以保留它並使用它,但它不能解決您的問題)。

問題出現在某種程度上,因爲RIA服務(?)需要一個'域名服務描述提供者'用於公開的Linq to EF實體。 LinqToEntitiesDomainService類具有已應用的LinqToEntitiesDomainServiceDescriptionProviderAttribute,因此從其繼承的生成的域服務也繼承提供者。

當您構建您自己的自定義域服務(從DomainService派生)並通過它公開實體時,您需要自己應用此屬性。此外,由於提供者無法從域服務基類中推斷出對象上下文類型(如果基類爲LinqToEntitiesDomainService,它可以做什麼),您需要在屬性構造函數中指定對象上下文類型,如下所示:

[EnableClientAccess()] 
[LinqToEntitiesDomainServiceDescriptionProvider(
          typeof(YourObjectContextType))] 
public class ClientDomainService : DomainService 
{ 
    ... 
} 

這應該解決它。

請注意,這意味着如果您希望將您的對象上下文從您的域服務中抽離出來,您會感到失望。我選擇了看似流行的存儲庫模型,其中對對象上下文進行操作的所有代碼都進入了由域服務使用的提供者。這有助於單元測試,但顯然不會刪除域服務對對象上下文的依賴。RIA Services需要上下文來理解您的實體,或者至少那些由域實體引用的實體(例如您的案例中的EntryCategoriesVersions)。

+0

Tor Haugen的答案爲我工作。我沒有足夠的代表來提高他的答案。我應該注意到,我爲我的RIA服務域上下文創建了一個基類,可以在不同的項目中重用,而實際定義實體的類是我擁有[LinqToEntitiesDomainServiceDescriptionProvider]屬性的類。因此,對objectcontext的強烈引用對我來說並不重要,因爲我直接引用了來自該特定objectcontext的實體。感謝所有的幫助! – 2011-06-17 15:52:51

+0

有關此問題可能發生的方式的進一步說明,請通讀此主題。 http://forums.silverlight.net/p/233457/583536.aspx – 2011-08-10 00:29:02

0

EntryCategoriesVersionsReference是什麼類型?嘗試根據類型添加一個[DataContract]註釋,並添加適當的[Key]和[DataMember]。它應該有助於編組。

相關問題