【问题标题】:How can I maintain child objects with LinqToSql over WCF?如何通过 WCF 使用 LinqToSql 维护子对象?
【发布时间】:2010-09-29 00:52:49
【问题描述】:

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

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

  • 配方(父高级对象)
    • 语言详细信息(名称、语言描述)(很多)
      • 标题(很多)
      • 步骤(很多)
        • 成分(很多)
        • 数量(很多)
        • 程序(很多)
      • 笔记(很多)

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

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

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

【问题讨论】:

  • 您定义了 DataContracts 还是您想要弄清楚的?
  • 目前 DataContracts 是 L2S 对象,我想摆脱它。
  • 尽管不建议将 L2S 对象用作 WCF DataContracts,但它确实有效,即使使用子对象也是如此。您只需确保在使用 WCF 发送 L2S 对象之前加载子对象(L2S 通常会延迟加载)。

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


【解决方案1】:

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

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

看起来你无论如何都必须重构——就像在你的 UI 层中重构对 linq2sql 的依赖一样开始。

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

【讨论】:

    【解决方案2】:

    如果您尝试使用 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 发送列表就变得轻而易举了。

    【讨论】:

    • 这是一个很好的答案,您填充配方对象列表的方式比我用来填充要通过 WCF 发送的对象的方法干净得多。我得试试。
    • 这是我的目标,但我现在最大的问题是如何优化子对象?例如,列表?现在我们只是简单地吹掉孩子并重新创建它们,因为它们是简单的文本记录,但在新设计中,我们将根据需要希望更新的优势。
    • +1 作为答案顺便说一句,它的方正建议,只需要有关儿童更新的更多信息。
    • 我所有的对象都继承了一个基类,我用它作为回发的粘合剂。每个 set 方法都会使需要更新字段为 true,当我将列表传回时,保存例程会检查子项是否需要更新。
    【解决方案3】:

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

    【讨论】:

    • 我完全同意这一点,传递子对象的ID与客户端应用程序完全无关。
    【解决方案4】:

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

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

    编辑:在帖子完成之前无意中发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多