如何从 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.ComplexTypemodelBuilder
构建的是什么?我们是否都在查看相同的错误消息? "在模型生成期间检测到一个或多个验证错误"
【参考方案1】:
不,这是不可能的,因为如果您定义它,则意味着复杂类型具有合同的导航属性。这在整个实体框架中是不允许的。该错误可能来自一些推断,Contract
已被定义为实体,但复杂类型正试图将其映射为其他东西 - 但这只是猜测。
【讨论】:
有什么办法可以规避这种行为吗? 不确定这如何与数据服务一起使用。您可以使用自定义未映射类型,但问题是数据服务如何处理这个? 你为什么不直接从客户那里查询一组合同呢? 我可能有 12 个实体应该定期查询并且彼此紧密相关。我需要发回这个对象图,以便客户端不会无意中忘记查询同时可能已更改的一两个实体。你对此有什么建议吗? 这看起来像是自定义 wcf 服务的案例。不适用于 wcf 数据服务。【参考方案2】:由于某种原因,您发布的 sn-p 对我来说很难阅读。但是,我可以告诉你,我已经通过 WCF 类型发送了这些。我通常不使用 ICollection 来声明我的列表,我倾向于使用 List 来代替,并且在接收有关客户端的信息时从来没有遇到太大问题。
也许这是您如何在数据合同上定义类的问题。
【讨论】:
我很好奇你是怎么做到的。在您的复杂类型中,您有实体类型列表吗? 正确。我有这样的东西作为我的数据合同: public class SomeClass private List以上是关于如何从 WCF 数据服务返回复杂类型?的主要内容,如果未能解决你的问题,请参考以下文章