如何通过WCF使用LinqToSql维护子对象?

时间:2008-12-31 16:22:29

标签: .net wcf linq-to-sql data-access-layer

我目前停留在这个解决方案的设计中。

数据层设计包括以下内容:

  • 食谱(父级高级对象)
    • 语言明细(名称,语言描述)(很多)
      • 标题(很多)
      • 步骤(很多)
        • 成分(很多)
        • 数量(很多)
        • 程序(很多)
      • 备注(很多)

我遇到的挑战是如何创建一个数据访问设计,当从WCF SaveRecipe(配方)方法填充对象时,该设计将添加/删除数据库中的子对象?

这一切都源于管理层要求我们在我们的应用程序中添加通信层,现在我们的UI耦合到我们的业务层,而BL直接耦合到DAL,我们基本上需要在之间注入WCF BL和DAL。

我在this thread中读到使用L2S对WCF不是一个好主意,但由于设计不是新的,我们必须使用这种方法,然后一旦我们离开它可以重构大量的UI工作。

4 个答案:

答案 0 :(得分: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 :(得分:1)

我喜欢Karl在您引用的thread上的回答:

  

最好创建自己的   数据传输的类   宾语。那些课程,当然,   将作为DataContracts实现。   在您的服务层中,您将进行转换   linq-to-sql对象和   数据载体对象的实例。   这很乏味,但它解耦了   服务的客户来自   数据库架构。它也有   给你更好的控制的好处   传递的数据   你的系统。

看起来你无论如何都要进行重构 - 首先重构你的UI层中对linq2sql的依赖。

我认为你没有快速简便的解决方案。

答案 2 :(得分:1)

我不建议在WCF上公开L2S类。创建DataContract对象的层次结构,并通过WCF传递它们。这样做的缺点是您必须将L2S对象“深度复制”到DataContract层次结构中,但好处是您只能包含通过网络传输所必需且适当的字段。例如,在我正在进行的项目中,我通过网络传递一个EmployeeData对象,该对象包含我的大部分L2S员工字段,但不包括雇员的盐渍哈希和&amp;密码盐。

答案 3 :(得分:0)

创建包括和排除子条目的类也是一个想法。我有时会创建这样的类:

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

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

编辑:在帖子结束前无意中发布。