C# 复杂对象赢得';使用'时不返回;包括';实体版本为6的WCF中的语法

C# 复杂对象赢得';使用'时不返回;包括';实体版本为6的WCF中的语法,c#,wcf,.net-4.5,entity-framework-6,t4,C#,Wcf,.net 4.5,Entity Framework 6,T4,好吧,这个问题让我很困惑,因为我看到我的客户机在返回带有“include”的对象时基本上断开连接并终止。但是,在WCF服务中,如果没有这一点,它也可以正常工作。问题是我真的希望通过导航设置那些连接的对象 基本上,代码是一个复杂的对象返回: public teCIF getCif(int aCifId) { using (CIFContainer context = GetCifContext()) {

好吧,这个问题让我很困惑,因为我看到我的客户机在返回带有“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服务发送的复杂类型不喜欢include语句,只是说:“不,不打算这样做”

作为参考,我的复杂对象已经被黑客攻击了很多次,因为它是从数据库生成的T4对象(缩写):

链接复杂项目的更新:

[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; }
}
[可序列化]
公共部分类TLU类型
{
公共TLU产品类型()
{
this.teCIFs=new HashSet();
}
[System.Xml.Serialization.XmlIgnore]
公共int乘积_TYPE_ID{get;set;}
公共字符串值{get;set;}
[System.Xml.Serialization.XmlIgnore]
公共虚拟ICollection teCIFs{get;set;}
}

我尝试过删除属性,但还没有搞乱WCF喜欢的“数据成员”类型。我只是不明白为什么这不起作用,因为我发誓我在过去的Entity Version 4中使用了与其他复杂类型相关的导航属性的复杂类型。

好的,所以我实际上从一个朋友那里得到了帮助,但我想这可能会为其他人带来帮助,所以我应该回答这个问题,因为它可能会帮助其他人。我必须添加一个自定义属性,为其创建一个类,用于确定循环引用。基本上,当使用WCF时,导航的指针不知何故丢失了,但当没有连接到服务时,导航的指针就没有问题了。这并不好,因为我希望我的服务使用WCF托管方法,而不仅仅是直接使用EntityV6的客户端调用

    [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*/);
        }
    }
使用系统;
使用System.ServiceModel;
使用System.ServiceModel.Description;
使用System.Runtime.Serialization;
使用System.Xml;
使用System.Collections.Generic;
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Method)]
公共类CycleCreferencesWareAttribute:属性、IContractBehavior、IOperationBehavior
{
private readonly bool_on=true;
公共自行车参考资料(bool on)
{
_开=开;
}
公共广播
{
获取{return\u on;}
}
#区域IOperationBehavior成员
void IOperationBehavior.AddBindingParameters(OperationDescription OperationDescription,System.ServiceModel.Channel.BindingParameterCollection bindingParameters)
{
}
void IOperationBehavior.ApplyClientBehavior(操作说明操作说明,System.ServiceModel.Dispatcher.ClientOperation ClientOperation)
{
CycleCreferenceSawareContractBehavior.ReplaceDataContractSerializePropertyBehavior(operationDescription,On);
}
void IOperationBehavior.ApplyDispatchBehavior(操作说明操作说明,System.ServiceModel.Dispatcher.DispatchOperation DispatchOperation)
{
CycleCreferenceSawareContractBehavior.ReplaceDataContractSerializePropertyBehavior(operationDescription,On);
}
void IOperationBehavior.Validate(操作说明操作说明)
{
}
#端区
#区域IContractBehavior成员
void IContractBehavior.AddBindingParameters(ContractDescription ContractDescription、ServiceEndpoint endpoint、System.ServiceModel.Channel.BindingParameterCollection bindingParameters)
{
}
void IContractBehavior.ApplyClientBehavior(ContractDescription ContractDescription,ServiceEndpoint endpoint,System.ServiceModel.Dispatcher.ClientRuntime ClientRuntime)
{
CycleCreferenceSawareContractBehavior.ReplaceDataContractSerializeRopectionBehavior(contractDescription,On);
}
void IContractBehavior.ApplyDispatchBehavior(ContractDescription ContractDescription,ServiceEndpoint endpoint,System.ServiceModel.Dispatcher.DispatchRuntime DispatchRuntime)
{
CycleCreferenceSawareContractBehavior.ReplaceDataContractSerializeRopectionBehavior(contractDescription,On);
}
void IContractBehavior.Validate(ContractDescription、ContractDescription、ServiceEndpoint)
{
}
#端区
}
公共类CycleCreferenceWareContractBehavior:IContractBehavior
{
私有常量int MaxItemsInObjectGraph=2147483647;
private const bool IgnoreExtensionDataObject=false;
私人住宅;
公共自行车引用WareContract行为(bool on)
{
_开=开;
}
#区域IContractBehavior成员
public void AddBindingParameters(ContractDescription、ServiceEndpoint端点、System.ServiceModel.Channel.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(契约描述契约描述ServiceEndpoint端点System.ServiceModel.Dispatcher.ClientRuntime客户端运行时)
{
ReplaceDataContractSerializeRopectionBehaviors(contractDescription,_on);
}
public void ApplyDispatchBehavior(ContractDescription ContractDescription、ServiceEndpoint endpoint、System.ServiceModel.Dispatcher.DispatchRuntime DispatchRuntime)
{
ReplaceDataContractSerializeRopectionBehaviors(contractDescription,_on);
}
public void Validate(ContractDescription、ContractDescription、ServiceEndpoint)
{
}
内部静态空隙替换
    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*/);
        }
    }