2011-04-12 102 views
1

是否可以从由实体类型集合构成的WCF数据服务中返回复杂类型?如何从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." 
+0

当您尝试此操作时会发生什么情况? – 2011-04-12 19:23:49

+0

我收到一个异常:“异常消息是'在模型生成期间检测到一个或多个验证错误:System.Data.Edm.EdmEntityType:Name:模式中的每个类型名称必须是唯一的。类型名'Contract'已经是定义“。 – Attilah 2011-04-12 19:26:58

+1

所以,这似乎与返回复杂类型无关。这是你的模型的问题。 – 2011-04-12 19:29:37

回答

0

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

+0

有什么办法可以规避这种行为吗? – Attilah 2011-04-12 19:44:51

+0

不确定这是如何与数据服务一起工作的。您可以使用自定义未映射类型,但问题是数据服务如何处理这个问题? – 2011-04-12 19:46:31

+0

wo!这是一个showstopper。 – Attilah 2011-04-12 19:54:46

0

由于某些原因,您发布的代码段很难阅读。但是,我可以告诉你,我已经通过WCF类型发送了类似的内容。我通常不会使用ICollection <>来声明我的列表,我倾向于使用列表<>,而且从未在客户端接收信息时遇到太多问题。

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

+0

我很好奇你是如何做到这一点的。在你的复杂类型中,你有实体类型列表吗? – Attilah 2011-04-12 22:05:11

+0

正确。我有这样的东西作为我的数据合同:public class SomeClass {private List mCustomers; public List Customers {get {return mCustomers;} set {mCustomers = value}}}然后在我的服务中:public SomeClass GetSome(){...}我还不知道如何发布片段。我会尽量在稍后再掀起一些东西。 – Efren 2011-04-13 21:56:25

+0

请张贴它。那会帮助我弄清楚我做错了什么...... – Attilah 2011-04-14 14:26:24

0

我不认为返回包含集合的复杂类型是一个问题。请参阅this post

在这里,我可以添加一个方法来返回IQueryable,它工作得很好。请注意,Department包含另一个集合。希望这可以帮助。