如何从 WCF 数据服务返回复杂类型?

Posted

技术标签:

【中文标题】如何从 WCF 数据服务返回复杂类型?【英文标题】:How to return Complex types from a WCF Data Service? 【发布时间】:2011-04-12 19:16:56 【问题描述】:

是否可以从由实体类型集合组成的 WCF 数据服务返回复杂类型?

例如:

 //the complex type to return
 class Entities
 
    ICollection<Contract> Contracts;
    ...

 

 //configuration
 public partial class MyContext: DbContext
 
    public MyContext()
        : base("name=DBEntities")
    
    

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.ComplexType<Entities>();
        modelBuilder.Entity<Contract>().HasKey(c=>c.Id);
        ...
    
    ...
  

 //the WCF Data Service
 public class PricingDataService : DataService<ObjectContext>, IDisposable
 
     [WebGet]
     public Entities GetEntities()
     
         return new Entities();
     
  

当我尝试上述配置时,我得到一个异常:

" The exception message is 'One or more validation errors 
were detected during model     generation: System.Data.Edm.EdmEntityType: Name: 
Each type name in a schema must be unique. Type name 'Contract' was already 
defined."

【问题讨论】:

当你尝试这个时会发生什么? 我得到一个异常:“异常消息是'在模型生成过程中检测到一个或多个验证错误:System.Data.Edm.EdmEntityType:名称:模式中的每个类型名称必须是唯一的。类型名称“合同”已定义。” 所以,这似乎与返回复杂类型无关。你的模型有问题。 我不明白为什么我的模型会出现问题,因为当我评论这行代码时:modelBuilder.ComplexType();错误消失了。 那么,modelBuilder 构建的是什么?我们是否都在查看相同的错误消息? "在模型生成期间检测到一个或多个验证错误" 【参考方案1】:

不,这是不可能的,因为如果您定义它,则意味着复杂类型具有合同的导航属性。这在整个实体框架中是不允许的。该错误可能来自一些推断,Contract 已被定义为实体,但复杂类型正试图将其映射为其他东西 - 但这只是猜测。

【讨论】:

有什么办法可以规避这种行为吗? 不确定这如何与数据服务一起使用。您可以使用自定义未映射类型,但问题是数据服务如何处理这个? 你为什么不直接从客户那里查询一组合同呢? 我可能有 12 个实体应该定期查询并且彼此紧密相关。我需要发回这个对象图,以便客户端不会无意中忘记查询同时可能已更改的一两个实体。你对此有什么建议吗? 这看起来像是自定义 wcf 服务的案例。不适用于 wcf 数据服务。【参考方案2】:

由于某种原因,您发布的 sn-p 对我来说很难阅读。但是,我可以告诉你,我已经通过 WCF 类型发送了这些。我通常不使用 ICollection 来声明我的列表,我倾向于使用 List 来代替,并且在接收有关客户端的信息时从来没有遇到太大问题。

也许这是您如何在数据合同上定义类的问题。

【讨论】:

我很好奇你是怎么做到的。在您的复杂类型中,您有实体类型列表吗? 正确。我有这样的东西作为我的数据合同: public class SomeClass private List mCustomers; public List Customersgetreturn mCustomers;setmCustomers = value 然后在我的服务中: public SomeClass GetSome()... 我还不知道如何发布 sn-ps。稍后我会尝试做点什么。 请张贴。这对帮助我弄清楚我做错了什么大有帮助...... 您在使用“WCF 数据服务”吗?基于 REST 的那个?我们不是在谈论 SOAP 服务。

以上是关于如何从 WCF 数据服务返回复杂类型?的主要内容,如果未能解决你的问题,请参考以下文章

无法从启用 wcf json 的服务向客户端返回嵌套类型

如何从 WCF 服务返回 multipart/form-data 作为响应

从 WCF 服务返回的 XML 中缺少集合项值

如何从安静的 WCF 服务返回对象列表

POX 从 WCF 数据服务返回数据

如何从 WCF 打印数组的值以形成标签?