在实体版本 6 的 WCF 中使用“include”语法时,复杂对象不会返回

2024-03-15

好吧,这让我很困惑,因为我刚刚看到我的客户端在返回带有“include”的对象时基本上断开连接并终止。然而,如果没有 WCF 服务,它也可以正常工作。问题是我真的希望通过导航设置那些连接的对象。

基本上,代码是一个复杂的对象返回:

public teCIF getCif(int aCifId)
        {
            using (CIFContainer context = GetCifContext())
            {
                var thing = context.teCIFs
                    .Include("Product_TYPE")
                    .FirstOrDefault(i => i.CIF_ID == aCifId);

                return thing;
            }
        }

现在奇怪的是,当我注释掉 include 语句时,这会工作得很好。就像通过 WCF 服务发送的复杂类型不喜欢包含语句一样,只是说:“不,不会那样做”。

作为参考,我已经对我的复杂对象进行了相当多的修改,因为它是从数据库(缩写)中生成的 T4 对象:

[Serializable]
    public partial class teCIF
    {
        public int CIF_ID { get; set; }
        public string CUSTOMER_NAME { get; set; }
        public string SITE_NAME { get; set; }
        [System.Xml.Serialization.XmlIgnore]
        public int PRODUCT_TYPE_ID { get; set; }

        public virtual tlPRODUCT_TYPE Product_TYPE { get; set; }
    }

链接复杂项目的更新:

[Serializable]
public partial class tlPRODUCT_TYPE
{
    public tlPRODUCT_TYPE()
    {
        this.teCIFs = new HashSet<teCIF>();
    }

    [System.Xml.Serialization.XmlIgnore]
    public int PRODUCT_TYPE_ID { get; set; }
    public string VALUE { get; set; }

    [System.Xml.Serialization.XmlIgnore]
    public virtual ICollection<teCIF> teCIFs { get; set; }
}

我已尝试删除属性,但尚未弄乱 WCF 喜欢的“数据成员”类型。我只是不明白为什么这不起作用,因为我发誓我在过去的实体版本 4 中已经使用具有与其他复杂类型相关的导航属性的复杂类型完成了此操作。


好吧,我实际上得到了一位朋友的帮助,但我认为这可能会出现在其他人身上,所以我应该回答这个问题,因为它可能会帮助其他人。我必须添加一个自定义属性,我为其创建一个类来确定循环引用。基本上,在使用 WCF 时,导航的指针会以某种方式丢失,但在未连接到服务时却很好。这不好,因为我希望我的服务使用 WCF 托管方法,而不仅仅是直接使用 Entity V6 进行客户端调用。

    [ServiceContract]
    public interface ICifService
    {

        [OperationContract]
        [CyclicReferencesAware(true)]
        teCIF getCif(int aCifId);
    }

实现类的工作原理如下:

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.Runtime.Serialization;
    using System.Xml;
    using System.Collections.Generic;

    [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Method)]
    public class CyclicReferencesAwareAttribute : Attribute, IContractBehavior, IOperationBehavior
    {
        private readonly bool _on = true;

        public CyclicReferencesAwareAttribute(bool on)
        {
            _on = on;
        }

        public bool On
        {
            get { return _on; }
        }

        #region IOperationBehavior Members

        void IOperationBehavior.AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        void IOperationBehavior.ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
        {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehavior(operationDescription, On);
        }

        void IOperationBehavior.ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
        {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehavior(operationDescription, On);
        }

        void IOperationBehavior.Validate(OperationDescription operationDescription)
        {
        }

        #endregion

        #region IContractBehavior Members

        void IContractBehavior.AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        void IContractBehavior.ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
        {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehaviors(contractDescription, On);
        }

        void IContractBehavior.ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime)
        {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehaviors(contractDescription, On);
        }

        void IContractBehavior.Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
        {
        }

        #endregion
    }

    public class CyclicReferencesAwareContractBehavior : IContractBehavior
    {
        private const int MaxItemsInObjectGraph = 2147483647;
        private const bool IgnoreExtensionDataObject = false;

        private bool _on;

        public CyclicReferencesAwareContractBehavior(bool on)
        {
            _on = on;
        }

        #region IContractBehavior Members

        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
        {
            ReplaceDataContractSerializerOperationBehaviors(contractDescription, _on);
        }

        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime)
        {
            ReplaceDataContractSerializerOperationBehaviors(contractDescription, _on);
        }

        public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
        {
        }

        internal static void ReplaceDataContractSerializerOperationBehaviors(ContractDescription contractDescription, bool on)
        {
            foreach (var operation in contractDescription.Operations)
            {
                ReplaceDataContractSerializerOperationBehavior(operation, on);
            }
        }

        internal static void ReplaceDataContractSerializerOperationBehavior(OperationDescription operation, bool on)
        {
            if (operation.Behaviors.Remove(typeof(DataContractSerializerOperationBehavior)) || operation.Behaviors.Remove(typeof(ApplyCyclicDataContractSerializerOperationBehavior)))
            {
                operation.Behaviors.Add(new ApplyCyclicDataContractSerializerOperationBehavior(operation, MaxItemsInObjectGraph, IgnoreExtensionDataObject, on));
            }
        }
        #endregion
    }

    internal class ApplyCyclicDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
    {
        private readonly int _maxItemsInObjectGraph;
        private readonly bool _ignoreExtensionDataObject;
        private readonly bool _preserveObjectReferences;

        public ApplyCyclicDataContractSerializerOperationBehavior(OperationDescription operationDescription, int maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences)
            : base(operationDescription)
        {
            _maxItemsInObjectGraph = maxItemsInObjectGraph;
            _ignoreExtensionDataObject = ignoreExtensionDataObject;
            _preserveObjectReferences = preserveObjectReferences;
        }

        public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
        {
            return new DataContractSerializer(type, name, ns, knownTypes, _maxItemsInObjectGraph, _ignoreExtensionDataObject, _preserveObjectReferences, null /*dataContractSurrogate*/);
        }

        public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
        {
            return new DataContractSerializer(type, name, ns, knownTypes, _maxItemsInObjectGraph, _ignoreExtensionDataObject, _preserveObjectReferences, null /*dataContractSurrogate*/);
        }
    }

一旦我将此属性应用于我的服务界面中的任何操作,它对于任何复杂类型都可以正常工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在实体版本 6 的 WCF 中使用“include”语法时,复杂对象不会返回 的相关文章

随机推荐

  • C++ 对象参数:多态性、值语义、对象生命周期?

    当我从 C 过渡到 C 时 我收到了很多关于尽可能使用值语义的建议 几乎可以保证 如果我在任何地方发布带有指针的问题 就会有人出现并建议它应该是一个值 我开始看到曙光 我在代码中发现了很多地方可以用堆栈分配的变量 通常是引用 替换动态分配和
  • python 中的图形上有很多边

    我有以下脚本 import pandas as pd from igraph import df p c pd read csv data edges csv edges list edges vertices list dict case
  • 您可以以非 root 用户身份在非特权容器中运行 DPDK 吗?

    我正在尝试在非特权 Docker 容器中运行 DPDK 虽然我可以限制容器的权限并将容器指定为非特权容器 但我仍然需要以 root 身份运行 dpdk 应用程序 例如 testpmd 我还可以以非 root 身份运行容器并使用 sudo 启
  • 将 .NET Core 2.0 Web 应用程序发布到 Azure 应用服务时出错

    我最近将 Visual Studio 2017 Community Edition 从版本 15 6 2 升级到 15 6 3 从那时起 我一直无法使用现有的发布配置文件成功将 NET Core 2 0 Web 应用程序部署到我的 Azur
  • 有什么方法可以捕获声明时常量的名称吗?

    我有课 我们称之为 SomeClass class SomeClass end 我不想以正常方式定义此类的实例 而是使用常量来定义它们 MyConstant SomeClass new 我希望能够捕获某个类设置的常量的名称 就像标准 rub
  • Webpack SASS-loader include 语句中断 SASS @import 语句

    因此 对于背景 最初我在 Webpack 配置中排除了 node modules 目录 该目录对于我的 sass import 语句运行良好 但很难包含 node modules 目录中的内容 所以我将SASS加载器切换为以下 test s
  • 获取与 URL 关联的所有 IP,Python

    我正在尝试查找与某个 URL 关联的所有 IP 我一直在使用 socket 包 但对不同功能返回的不同数量的 IP 感到困惑 例如见下文 有没有返回所有IP的函数 socket gethostbyname google com return
  • 使用Python mechanize下载文件

    我正在尝试使用 python 和 mechanize 从网站下载文件 我当前的代码成功登录网站并打开包含下载链接的页面 下载链接是 https www lendingclub com browse browseNotesRawDataV2
  • 升级到 XCode 4 后无法链接 ppc

    我跟着这些说明 https stackoverflow com questions 5333490 how can we restore ppc ppc64 as well as full 10 4 10 5 sdk support to
  • 单击 POI 时获取谷歌地图上的 placeId

    我在我的网站上使用 Google Maps JS V3 API 当用户搜索某个地点时 我可以通过 placeId 使用 getDetails 当用户单击 POI 时 我想执行相同的操作 但是 当用户单击 POI 而不是使用搜索框时 我似乎找
  • Fabric.js 子类中的颜色正在更改为黑色。

    我正在尝试子类 Fabric Group 并将 JSON 字符串加载到其中 我遇到的问题是子类组中的 Fabric Rect 的颜色正在更改为黑色 当我直接在 Fabric Group 中执行此操作时 效果很好 我一直在玩 fromObje
  • Ruby Mailer:参数数量错误

    我正在努力构建我的邮件程序 但我不断遇到 参数数量错误 0 代表 1 可以说我疯了 但我觉得我定义的一切都是正确的 控制器 为简洁起见被截断 def create cms484 Cms484 new cms484 params respon
  • scala 中的间接递归泛型类型定义

    直接类型递归就可以工作 trait TT T lt TT T 但我可以用天真的方法做间接的 trait UU V lt VV UU V trait VV U lt UU VV U 给我错误 CyclicTraits scala 23 err
  • C++ 中对外部命令的线程安全并发调用

    我一直在互联网上寻找一种方法 以线程安全的方式从我的 C 程序中并发调用外部程序 据我了解 popen system 和 fork 都不是线程安全的 在我看来 这里缺少了一些东西 到目前为止我还没有找到 是否有可能没有办法从不同线程并发调用
  • 禁用特定块的全页缓存

    我正在使用具有全页缓存功能的 magento EE 有一个动态更新的块 但我似乎无法禁用它的缓存 我想要实现的理想目标是 仅禁用特定块的缓存 以便每次页面加载时都会再次呈现它 我尝试过的事情 将 unsetData 包含到布局文件中
  • 如何计算 WPF 绑定中的值

    我有一个应用程序 它使用两个滑块来生成在代码中其他地方使用的产品 我想要的是将产品值绑定到文本块或工具提示 例如 看起来像 10 x 15 150 第一部分很简单 如下所示
  • 如何在面向 .NET Core 的 Visual Studio 2015 中引用 System.Data?

    我正在尝试访问IDbConnection接口在类库中 以便创建一个连接对象来连接数据库并从数据库中获取数据 但我无法访问IDbConnection接口应该是在系统数据 dll 我在 NuGet 中也找不到它 那么 我该怎么办呢 Micros
  • 想要在提交表单后刷新 div 吗?

    我有一个简单的表格和一个 div 容器 我的问题是我在提交表单时尝试刷新 div div FOO FOO FOOOOOOOOOOOOOOOOO div div
  • 如何在 iOS 8 启动屏幕中设置标签字体

    我们如何在启动屏幕中将字体设置为标签 我尝试过通过故事板设置自定义字体 该字体已应用并在情节提要中看到 但当我启动应用程序时 我无法看到应用的字体 如何克服这个问题 尽管它可能看起来像在 Xcode 6 中一样 但您无法为启动屏幕指定自定义
  • 在实体版本 6 的 WCF 中使用“include”语法时,复杂对象不会返回

    好吧 这让我很困惑 因为我刚刚看到我的客户端在返回带有 include 的对象时基本上断开连接并终止 然而 如果没有 WCF 服务 它也可以正常工作 问题是我真的希望通过导航设置那些连接的对象 基本上 代码是一个复杂的对象返回 public