当我不想在以后跟踪实体*时,如何通过WCF服务发送POCO实体?

时间:2012-11-28 16:18:02

标签: wcf entity-framework poco proxy-classes

我有一个ASP.NET MVC 4项目,其中Controller调用WCF服务层,该层调用业务层,使用EF 5.0实体的存储库。然后结果作为POCO实体返回给Controller。

它工作正常,而WCF服务直接引用为库,但我知道它不能作为服务引用,因为它们需要序列化,并且启用ProxyCreation这是不可能的。

我不想创建DTO,因为我使用生成的POCO实体,这就是为什么它们以我的拙见存在。 我想仅在POCO实体到达服务层之前跟踪更改。

很多人谈论使用DTO,即使它们与POCO相同,如果我这样做,我可以创建自动生成的复制类,只是使用不同的名称作为“代理禁用POCO作为DTO”,会是什么有点奇怪。

我可以杀死POCO的代理类吗?从服务层返回时,对象可以被序列化吗?

此外,我不知道这个想法是否是一个好习惯。但将“干净”的实体发送到我的控制器,准备好我映射到ViewModels会很棒。 我也在寻找表现。

2 个答案:

答案 0 :(得分:1)

使用ProxyDataContractResolver解决问题。我们也必须使用[Serializable] and [DataContract(IsReference=true)]。通过这种组合,可以启用ProxyCreation。

答案 1 :(得分:0)

我们处理此问题的方法是执行以下操作:

  1. 自定义生成POCO类的T4,以便生成用其修饰的类 [Serializable()] and [DataContract(IsReference=true)]属性。
  2. 前端(视图)和后端(wcf服务/业务层)都引用了POCO生成的类,因为由于IsReference = true,您将不会使用代理。
  3. 基本上就是这样。

    有了这个,您不必创建DTO,只需在后端和前端使用POCO类。

    请记住,使用IsReference = true句柄的WCF不喜欢冗余对象(因此这对于某些具有导航属性的POCO类来说是一个问题)。