Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在WCF上使用LinqToSql维护子对象?_.net_Wcf_Linq To Sql_Data Access Layer - Fatal编程技术网

.net 如何在WCF上使用LinqToSql维护子对象?

.net 如何在WCF上使用LinqToSql维护子对象?,.net,wcf,linq-to-sql,data-access-layer,.net,Wcf,Linq To Sql,Data Access Layer,我目前正在设计这个解决方案 数据层设计包括以下内容: 配方(父级高级对象) 语言细节(名称、语言描述)(多个) 标题(多个) 步骤(多个) 成分(很多) 数量(多) 程序(许多) 注释(许多) 我面临的挑战是如何创建一个数据访问设计,当从WCF SaveRecipe(recipe)方法填充对象时,该设计将在数据库中添加/删除子对象 这一切都源于管理层要求我们在应用程序中添加一个通信层,现在我们的UI耦合到业务层,BL直接耦合到DAL,我们基本上需要在BL和DAL之间注入WCF 我

我目前正在设计这个解决方案

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

  • 配方(父级高级对象)
    • 语言细节(名称、语言描述)(多个)
      • 标题(多个)
      • 步骤(多个)
        • 成分(很多)
        • 数量(多)
        • 程序(许多)
      • 注释(许多)
我面临的挑战是如何创建一个数据访问设计,当从WCF SaveRecipe(recipe)方法填充对象时,该设计将在数据库中添加/删除子对象

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


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

我喜欢Karl在您提到的问题上给出的回答:

最好创建自己的 用于传输数据的类 对象当然,那些课程, 将作为数据合同实施。 在服务层中,您需要转换 在linq到sql对象和 数据载体对象的实例。 这是乏味的,但它解耦了 来自 数据库模式。它也有 给你更好控制的优势 在中传递的数据的 你的系统

看起来您无论如何都必须进行重构——也可以从重构UI层中对linq2sql的依赖关系开始


我认为你没有一个简单快捷的解决方案。

如果你想用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; }

}
[DataContract]
公共课食谱{
[数据成员]
公共字符串名称{get;set;}
[数据成员]
公共字符串说明{get;set;}
[数据成员]
公共列表成分{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();
List recipes=(来自dc.recipe中的r
选择新记录{
Name=r.Name,
Description=r.Description,
成分=(制作成分列表的Linq代码)
}).ToList();

然后使用WCF将列表发送到下一行就成了小菜一碟。

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

也可以创建包含和排除子条目的类。我有时会创建这样的类:

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

class RecipeWithIngredients : Recipe {
    [DataMember] public IList<Ingredient> Ingredients;
}
类配方{
[DataMember]公共字符串名称;
[DataMember]公共字符串描述;
}
类RecipeWithingComponents:配方{
[数据成员]公共IList成分;
}

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

您是否定义了数据契约,或者您正试图弄清楚这一点?目前,数据契约是L2S对象,我不想这样。尽管不建议将L2S对象用作WCF数据契约,但它确实有效,即使是子对象。您只需确保在使用WCF发送L2S对象之前加载了子对象(L2S通常会延迟加载)。这是一个很好的答案,您填充配方对象列表的方式比我将通过WCF发送的填充对象的方法要干净得多。我得试试。这是我的目标,但我现在最大的问题是如何优化子对象?例如,列表?现在我们只是简单地吹掉子对象并重新创建它们,因为它们是简单的文本记录,但在新的设计中,我们需要根据需要获得更新的优点。+1对于答案,顺便说一句,它的方形建议,只需要更多关于子对象更新的信息。我所有的对象都继承了一个基类,我用它作为回帖的粘合剂。每个set方法都会使一个needs update字段为true,当我将列表传回save例程时,会检查子对象是否需要更新。我完全同意这一点,传递子对象的ID与客户端应用程序完全无关。