【问题标题】:Ignoring Relationships in Data Returned from WCF Request忽略从 WCF 请求返回的数据中的关系
【发布时间】:2026-01-23 09:35:01
【问题描述】:

我在查找这方面的信息时遇到了很多麻烦,但由于实体框架定义中的关系,实际上发送的数据过多。我有几张桌子,但重要的是:Application & Owner。由于数据库中的外键约束,这里存在一对多(所有者)关系。 (见下文)

这是问题所在:当我尝试返回单个 Owner 对象时,所有应用程序数据也会在 XML 中发送出去,但我不希望发送任何这些数据。相反,我希望能够创建一个能够在发送应用程序数据时不包含所有者信息的操作(尽管这并不是什么大不了的事)。

我想维护 FK 约束和关系,但限制 WCF 服务返回的数据,但在这里碰壁了。我需要修改什么才能使这项工作。

以下是获取 Owner 对象的代码:

界面:

[OperationContract]
[WebGet(UriTemplate = "Apps/{id}/{ownernum}", BodyStyle = WebMessageBodyStyle.Bare)]
[Description("Gets specific owner information from the database using an appid and owner number")]
Owner GetOwnerInfo(string id, string ownernum);

实现(删除验证和其他多余代码):

public Owner GetOwnerInfo(string id, string ownernum)
{
     ...

    Owner owner = entities.Owners.SingleOrDefault(o => o.AppId == appId && o.OwnerNumber == ownerNumber);
    if (owner != null)
    {
        logger.Info("Owner {0} from application id {1} sent via HTTP GET", ownerNumber, appId);
        return owner;
    }
    else
    {
        logger.Warn("Cannot find owner {0} from application id {1}", ownerNumber, appId);
        throw new WebFaultException<string>(string.Format("Cannot find Owner {0} from AppId {1}", ownerNumber, appId), HttpStatusCode.NotFound);
    }

   ...
}

【问题讨论】:

  • 可以看到您的网络服务方法中的代码吗?你在使用 WCF 数据服务吗?
  • @robbell 当然。我将发布获得所有者的代码。给我一分钟格式化它。
  • @RobBell 已添加...如果您正在寻找其他内容,请告诉我

标签: c# .net entity-framework wcf


【解决方案1】:

现实情况是,无论如何您都不应该通过 WCF 服务发送 EF 对象。事实上,大多数时间,由于循环引用,它们根本不会序列化(不确定你是如何解决这个问题的)。

无论如何,真正的解决方案是创建一个DataContract,其中正是您要通过网络发送的数据,然后在该数据和您的 EF 对象之间编写一个转换函数。

那么您的 WCF 服务发送的唯一对象是数据协定对象,您可以控制发送/不发送的内容。

【讨论】:

  • 这听起来正是我正在寻找的东西,但以前没有使用过它(我是实体框架的新手)。您有任何链接/示例可以为我指明正确的方向吗?
  • @JNYRanger 数据契约实际上是一个 WCF 概念。我不确定您到底在寻找什么,但这里是他们的 MSDN 介绍文章:msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx
  • 这正是我一直在寻找的,感谢您为我提供了一些知识!
【解决方案2】:

@BradleyDotNet 所说的是正确的,但作为一种快速修复,您可以急切地执行查询(通过.ToList() 或查询结束时的类似内容)或禁用延迟加载 (context.Configuration.LazyLoadingEnabled = false;)

这个问题涉及到你在做什么:

How to exclude a related table when use Entity Framework

如果以后需要加载相关项目,请使用db.MyEntity.Include(...)

https://msdn.microsoft.com/en-gb/data/jj574232.aspx

【讨论】:

  • 我最终用 DataContracts 编写了一些 DTO,但我会牢记这一点,以备将来使用。谢谢!
最近更新 更多