【问题标题】:Return Entity Framework objects from WCF从 WCF 返回实体框架对象
【发布时间】:2015-08-27 00:36:33
【问题描述】:

我正在开发 WCF 服务以向多个移动客户端提供数据。数据模型是 Entity Framework 4.0。架构如下。

当我返回 SysUser 的对象时,结果还包含导航属性和 EntityKey 以及其他与 EF 相关的内容。我是否有可能得到纯对象(只有没有关系的数据库字段等)。

谢谢 更新 发生异常“LINQ to Entities 中仅支持无参数构造函数和初始化程序”。在以下代码上:

return (from u in DataSource.SysUsers
                   where u.UserID == UserID
                   select new Player(u)
                   ).FirstOrDefault();

【问题讨论】:

    标签: wcf entity-framework-4 linq-to-entities


    【解决方案1】:

    您可能希望通过网络发送DTOs 而不是您的 EF 对象。

    您可以使用 AutoMapper 之类的东西从 EF 对象中填充您的 DTO。

    【讨论】:

    • 谢谢乔,我想我得到了正确的答案,因为我是 EF 的新手,所以我认为 EF 中可能有一些内置的东西来获取 DTO。好吧,现在我只是在我自己的 DTO 的构造函数中做了映射。如果需要,稍后将使用自动映射器进行更大的项目。
    • 一件事是向我确认,要隐藏我的业务对象和其他东西,我需要另一个类说播放器,它只包含我必须发送的信息。 public Player(SysUser User) { UserID = User.UserID;名字 = 用户.FName;电子邮件 = 用户.电子邮件;姓氏 = 用户.LName;密码 = 用户密码; ReceiveNewsletter = User.ReceiveNewsletter == null ? false : User.ReceiveNewsletter.Value;用户名 = 用户.用户名; }
    • 是的,没错 - 使用另一个类(DTO),只包含您需要通过网络发送的字段。
    • 将 linq 对象传递给构造函数时出现问题,“LINQ to Entities 中仅支持无参数构造函数和初始化程序。发生异常”。返回(从 DataSource.SysUsers 中的 u.UserID == UserID 选择新的 Player(u)).FirstOrDefault(); – LojiSmith Kaleem 42 秒前编辑
    • 那么你在EF类中创建了一个新的构造函数了吗?您需要确保没有任何参数的构造函数在类中。
    【解决方案2】:

    我认为如果您在导航属性的SysUser 模型中删除virtual 关键字,则不会加载这些关键字。稍后,如果您需要加载此属性,您可以按照此处所述手动执行:http://msdn.microsoft.com/en-us/data/jj574232

    现在,如果您想让SysUser 通过 WCF 服务旅行,这不是一个好主意。首先,您的服务的客户需要对您的模型项目的引用......这感觉不对。如果您不引用您的模型,您将获得它的代理,这与 Joe R 关于 DTO 的解释大致相同。

    这是一个相关的答案:https://stackoverflow.com/a/7161377/7720

    【讨论】:

    • 将 linq 对象传递给构造函数时出现问题,“LINQ to Entities 中仅支持无参数构造函数和初始化程序。发生异常”。 return ( from u in DataSource.SysUsers where u.UserID == UserID select new Player(u) ).FirstOrDefault();
    • 你不能传递“u”参数...这就是异常的原因。
    • 嘿,我使用了 Automapper,它让我的映射变得很简单:p
    • 为什么你对返回实体感觉不对!?你的 dto 将是完全相同的对象,而不是这个;优先考虑代码并忽略 EF 的功能...
    • @efaruk 如果您有多个移动客户端使用该服务,最好不要与您的 EF 模型耦合。即使您没有服务,例如在 MVC 项目中,最好在视图中使用 ViewModels 而不是 EF 模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多