EF4 POCO WCF Serialization problems (no lazy loading, proxy/no proxy, circular references, etc)

后端 未结 5 1458
慢半拍i
慢半拍i 2021-02-15 12:23

OK, I want to make sure I cover my situation and everything I\'ve tried thoroughly. I\'m pretty sure what I need/want can be done, but I haven\'t quite found the perfect combin

相关标签:
5条回答
  • 2021-02-15 12:52

    Try setting myContext.ContextOptions.ProxyCreationEnabled = false;

    If the problem is solved (like mine) then you've not followed the steps mentioned in: http://msdn.microsoft.com/en-us/library/ee705457.aspx

    This solved the problem for me.

    0 讨论(0)
  • 2021-02-15 12:52

    You can use the ApplyDataContractResolverAttribute and a ProxyDataContractResolver along with the CyclicReferencesAwareAttribute. At first this produces error like this one - as if there is no DataContractResolver specified at all:

    Type 'System.Data.Entity.DynamicProxies.Whatever_E6......A9' with data contract name 'Whatever_E6......A9:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

    It will work with one simple change.

    In the ApplyCyclicDataContractSerializerOperationBehavior, the constructors for the DataContractSerializer must also pass in the DataContractResolver. This is left out of all the versions I have seen online.

    Example:

    public class ApplyCyclicDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
    {
        private readonly Int32 _maxItemsInObjectGraph;
        private readonly bool _ignoreExtensionDataObject;
    
        public ApplyCyclicDataContractSerializerOperationBehavior(OperationDescription operationDescription, Int32 maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences)
            : base(operationDescription)
        {
            _maxItemsInObjectGraph = maxItemsInObjectGraph;
            _ignoreExtensionDataObject = ignoreExtensionDataObject;
        }
    
        public override XmlObjectSerializer CreateSerializer(Type type, String name, String ns, IList<Type> knownTypes)
        {
            return new DataContractSerializer(type, name, ns, knownTypes, 
                _maxItemsInObjectGraph, 
                _ignoreExtensionDataObject, 
                true, 
                null /*dataContractSurrogate*/, 
                DataContractResolver); // <-----------------------------
        }
    
        public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
        {
            return new DataContractSerializer(type, name, ns, knownTypes, 
                _maxItemsInObjectGraph, 
                _ignoreExtensionDataObject, 
                true, 
                null /*dataContractSurrogate*/, 
                DataContractResolver); // <-----------------------------
        }
    }
    
    0 讨论(0)
  • 2021-02-15 12:55

    Faced the same issue today and used Value Injecter to solve it. It's as simple as:

    var dynamicProxyMember = _repository.FindOne<Member>(m=>m.Id = 1);
    var member = new Member().InjectFrom(dynamicProxyMember) as Member;
    

    We couldnt afford disabling ProxyCreation

    0 讨论(0)
  • 2021-02-15 13:03

    hrmm, I may not have fully understood the issue, but everytime I run into circular references with WCF the answer is to change [DataContract] on the offending classes to [DataContract(IsReference = true)].

    This is a huge help compared to all the drek of messing with the contract resolvers that was needed pre WCF 3.5 SP1.

    Hope this helps.

    0 讨论(0)
  • 2021-02-15 13:18

    You might want to check out my blog post on this specific scenario - please email me if it doesn't help fix your current predicament! I've included a sample solution as well.

    Please drop me some feedback either way, I'd really like to hear from more people on this particular issue - especially with the implementation problems on the client end of things.

    0 讨论(0)
提交回复
热议问题