我正在开发一个需要从WCF服务获取数据的项目。服务代码通过实体框架查找数据库。但是为了防止将EF生成的类通过线路发送到客户端生成的代理中,我们决定将EF类中的值映射到自定义构建的DTO类,其中mapper类负责从生成的EF中挑选值类和将它们放入DTO类。然后,我们将这些DTO类用于服务方法的请求和响应。 EF从彼此相关的表构建类。我得到了各种类,其属性如下所示:
public global::System.Data.Objects.DataClasses.EntityCollection<SubAttachment> Attachments
{}
public global::System.Data.Objects.DataClasses.EntityReference<Gl> GlCodeReference
{}
一些属性附加了关键字Reference,我猜测它为EF在该字段上查找相关表提供了一些方法。
如果我不想发送重的EF类,是否有比这种映射方法更好/不同的方法?如果没有,是否有一些参考资料可以帮助我理解实体框架如何构建类。
感谢您的时间
答案 0 :(得分:1)
由于您需要从EF框架支持的WCF服务获取数据,您是否考虑过使用OData来公开EF对象?看看下面的一些链接:
http://www.hanselman.com/blog/ODataBasicsAtTheAZGroupsDayOfNETWithScottGu.aspx
http://blogs.msdn.com/b/adonet/archive/2010/10/27/entity-framework-and-odata-pdc10.aspx
答案 1 :(得分:1)
在EF中创建类时,它们的字段中具有[DataMember]
属性,这是唯一通过网络发送的数据。所以,它没有看起来那么重......
但是,由于您正在通过WCF,因此应该生成实体以进行自我跟踪,因此当他们返回服务时,您知道更改了什么,并且不必从db重新获取每个实体比较
如果你仍然想要DTO,你也可以生成它们。如果您正在使用EF4.0,您可以选择提取实际代码生成的T4文件(.tt) - 使用它并根据您的需要进行更改并生成DTO和映射器类......
从edmx获取.tt文件(仅适用于EF4):右键单击模型,选择添加代码生成项,然后选择EntityObject生成器,如果要通过wcf传输对象,则选择另一个。这将创建一个tt文件,您可以通过发出保存命令来运行(如果您想允许它运行,您将收到提示)。保存后,它将生成一个文件,该文件与在EntityObject生成器的情况下由edmx模型生成的文件完全相同,或者如果您使用另一个生成器,则将有两个.tt文件...
答案 2 :(得分:0)
我使用了与下面链接中的方法非常相似的东西以及一些自定义的部分类,并且它工作得非常好。