2008-12-31 35 views
3

我目前被困在這個解決方案的設計中。如何使用WCF通過LinqToSql維護子對象?

數據層設計由以下部分組成:

  • 配方(母高電平對象)
    • 語言明細(名,由語言描述)(許多)
      • 頭(很多)
      • 步驟(許多)
        • 種成分(多)
        • 數量(多)
        • 程序(多)
      • 筆記(許多)

是我遇到的挑戰是如何創建一個數據訪問設計,當從WCF SaveRecipe(recipe)方法填充對象時,將添加/刪除數據庫中的子對象?

這一切都源於管理層要求我們在我們的應用程序中添加一個通信層,現在我們的UI與我們的業務層耦合,並且BL直接耦合到DAL,我們基本上需要在WCF之間注入WCF BL和DAL。

我已經在this thread中讀過使用L2S對WCF不是好主意,但由於設計並不新鮮,我們必須使用這種類型的方法,然後一旦我們可以重構大量的UI工作。

+0

您是否定義了您的DataContracts或者您想要弄清楚什麼? – 2008-12-31 16:24:50

+0

目前DataContracts是L2S對象,我想擺脫這種情況。 – 2008-12-31 16:38:10

+0

儘管不建議將L2S對象用作WCF DataContracts,但即使使用子對象,它也可以工作。您只需確保在使用WCF發送L2S對象之前加載子對象(L2S通常會推遲加載)。 – Sam 2009-01-08 09:34:37

回答

5

如果您嘗試使用WCF發送內容,建議您創建一個要在域中移動的數據模型。據我發現,你不能序列化IQueryable對象,但你可以創建一組Linq填充然後序列化的類。例如:

[DataContract] 
public class Recipe { 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Description { get; set; } 

    [DataMember] 
    public List<Ingredient> Ingredients { get; set; } 

} 

然後填補了

List<Recipe> recipes = (from r in dc.recipe 
          select new Recpie { 
           Name = r.name, 
           Description = r.description, 
           Ingredients = (Linq code to make list of ingredients) 
          }).ToList(); 

然後發送列表中向下與WCF的界線將變得小菜一碟。

1

我喜歡上你thread引用從卡爾這樣的回答:

這是更好地創建自己的 類數據 物體的傳遞。這些類,當然, 將被實現爲DataContracts。 在您的服務層中,您將在數據載體對象的linq-to-sql對象和 實例之間轉換 。 它是單調乏味的,但它將服務的 客戶端從 數據庫架構中分離出來。它還具有 的優勢,使您可以更好地控制 在您的系統中傳遞的數據。

它看起來像你將不得不重構反正 - 以及通過重構UI層中的linq2sql的依賴關係開始。

我不認爲你有一個快速簡單的解決方案。

1

我不建議通過WCF公開L2S類。創建DataContract對象的層次結構,並通過WCF傳遞這些對象。其缺點是你必須將你的L2S對象「深拷貝」到你的DataContract層次結構中,但好處是你只能包含必要和正確的通過網絡傳輸的字段。例如,在我現在正在開發的一個項目中,我通過包含大部分L2S Employee字段的網絡傳遞EmployeeData對象,但排除了員工的鹽漬散列&密碼鹽之類的內容。

0

創建包含和不包含子條目的類也可能是一個想法。我有時創建類似這樣的:

class Recipe { 
    [DataMember] public string Name; 
    [DataMember] public string Description; 
} 

class RecipeWithIngredients : Recipe { 
    [DataMember] public IList<Ingredient> Ingredients; 
} 

編輯:無意發佈之前,職位完成。