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

Posted

技术标签:

【中文标题】如何通过 WCF 使用 LinqToSql 维护子对象?【英文标题】:How can I maintain child objects with LinqToSql over WCF? 【发布时间】: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 通常会延迟加载)。 【参考方案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;

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

【讨论】:

以上是关于如何通过 WCF 使用 LinqToSql 维护子对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 LINQ 转移到 SQL 到“LINQ 到 WCF”?

在数据访问应用程序块之上使用“LINQ to SQL”和“WCF 数据服务”

wcf 将 linq 发送到 sql DataContext

如何在 Restful WCF 服务中管理会话

为啥,当我在 WCF 服务中模拟时,当我尝试运行 LINQ to SQL 查询时,我的服务不能加载 System.Transactions?

使用命名管道向子进程发送参数