2008-12-31 73 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; 
} 

编辑:无意发布之前,职位完成。