我已经在这个问题上提出了许多死路一条。据推测,.NET 3.5 SP1在WCF合同中支持ADO.NET实体框架实体。但是当我寻找有关它的可靠信息时,我没有得到很多答案。我在MSDN线程上找到了这个片段。有人对这个有经验么? [DataContract]发生了什么?这就是全部吗?为什么这方面的材料很少?
这是Tim Mallalieu在微软的回答。
实体框架中生成的实体类型默认为数据合同。 如果我要在实体设计器中创建一个简单的模型,如下所示: 购物车实体类型默认为DataContract,其所有属性都注释为数据成员。然后我们可以在WCF服务中使用它,如下所示:
[ServiceContract]
public interface IService1
{
[OperationContract]
Cart[] AllCarts();
}
public class Service1 : IService1
{
public Cart[] AllCarts()
{
using (MSPetShop4Entities context = new MSPetShop4Entities())
{
var carts = from c in context.Carts select c;
return carts.ToArray();
}
}
}
由于实体是DataContracts,您现在可以根据需要推送服务并通过网络发送这些服务。
答案 0 :(得分:6)
我建议您不要直接返回实体。不幸的是,Microsoft选择将特定于实现的数据作为DataContract实体的一部分。这不会与其他平台互操作,甚至可能无法在.NET版本之间进行互操作。
相反,我建议您遵循数据传输对象模式,只返回POCO类,它们是实体中数据的副本,没有任何行为。您可以返回此类的列表以表示表等。
答案 1 :(得分:3)
“共享接口而非类型”原则预示着您不拥有电线的两端和/或您正在编写面向公众的Web服务。 WCF可以在上下文中使用(并且被使用),而这种情况肯定是不。许多企业n层体系结构都有一个面向WCF的应用程序层,以便在其他方面实现负载平衡。在这些情况下,分享类型是完全有效的,事实上,这是理想的。
答案 2 :(得分:1)
您可以轻松使用ADO.NET Data Services。
答案 3 :(得分:1)
回应评论的更多细节:
EF生成的类有几个问题。我现在正在查看SalesOrderHeader和SalesOrderDetail的AdventureWorks示例。 SalesOrderDetail实体具有“SalesOrderHeader”和“SalesOrderHeaderReference”属性,两者都标记为DataMembers。这看起来像一个错误,因为“SalesOrderHeader”属性也标记为[XmlIgnore]和[SoapIgnore]。
另外,请考虑是否要首先将链接序列化回父SalesOrderHeader。究竟应该序列化什么? SOAP不以可互操作的方式支持引用。
最后,实体的基类也是数据合约。然而,它们与您返回的数据无关 - 它们纯粹是一个实现工件。
简而言之,微软搞砸了这个。他们没有想到这一点。
关于生成DTO类的方法,我建议研究各种代码生成工具,比如CodeSmith。您可以自己编写代码来执行此操作;我是在以前的职位上这样做的。生成DTO的好处是你还可以生成转换到DTO和从DTO转换的方法。
至于开销,在内存中移动一些数据的开销与通过网络发送数据所需的时间相比没什么用呢!