【问题标题】:How to return Complex types from a WCF Data Service?如何从 WCF 数据服务返回复杂类型?
【发布时间】: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 构建的是什么?我们是否都在查看相同的错误消息? "在模型生成期间检测到一个或多个验证错误"

标签: c# .net wcf wcf-data-services entity-framework-4.1


【解决方案1】:

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

【讨论】:

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

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

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

【讨论】:

  • 我很好奇你是怎么做到的。在您的复杂类型中,您有实体类型列表吗?
  • 正确。我有这样的东西作为我的数据合同: public class SomeClass { private List mCustomers; public List Customers{get{return mCustomers;}set{mCustomers = value}} } 然后在我的服务中: public SomeClass GetSome(){...} 我还不知道如何发布 sn-ps。稍后我会尝试做点什么。
  • 请张贴。这对帮助我弄清楚我做错了什么大有帮助......
  • 您在使用“WCF 数据服务”吗?基于 REST 的那个?我们不是在谈论 SOAP 服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多