public void Graph_serialization_works_with_change_tracking_cycle_and_lazy_loading_disabled()
        {
            using (var context = new ProxiesContext())
            {
                context.Configuration.LazyLoadingEnabled = false;
                var children = new MeTrackChangesS[2];
                MeTrackChangesS[] deserializedChildren;
                var childProxy1 = context.MeTrackChanges.Create();
                var childProxy2 = context.MeTrackChanges.Create();
                var parentProxy = context.MeTrackChanges.Create();

                children[0]        = childProxy1;
                children[1]        = childProxy2;
                childProxy1.Id     = 77;
                childProxy2.Id     = 88;
                parentProxy.Id     = 99;
                childProxy1.Parent = parentProxy;
                childProxy2.Parent = parentProxy;
                parentProxy.Children.Add(childProxy1);
                parentProxy.Children.Add(childProxy2);

                var deserialized = DeserializeFromBinaryFormatter(childProxy1);

                Assert.Same(childProxy1.GetType(), deserialized.GetType());
                Assert.Equal(77, deserialized.Id);
                Assert.Equal(99, deserialized.Parent.Id);
                Assert.Equal(2, deserialized.Parent.Children.Count);
                Assert.True(deserialized.Parent.Children.Contains(deserialized));

                deserializedChildren = deserialized.Parent.Children.ToArray();

                for (int i = 0; i < children.Length; i++)
                {
                    Assert.Same(children[i].GetType(), deserializedChildren[i].GetType());
                    Assert.Equal(children[i].Id, deserializedChildren[i].Id);
                    Assert.Equal(deserializedChildren[i].Parent, deserialized.Parent);
                }
            }
        }
        public void Lazy_loading_proxy_can_be_data_contract_deserialized_with_known_types_when_running_under_full_trust()
        {
            using (var context = new ProxiesContext())
            {
                var proxy      = context.MeLazyLoads.Create();
                var otherProxy = context.MeTrackChanges.Create();

                Assert.False(proxy is IEntityWithRelationships);
                proxy.Id = 77;
                proxy.MeComplexTypeS.Number = 88;

                var serializer = new DataContractSerializer(
                    proxy.GetType(), new DataContractSerializerSettings {
                    KnownTypes = new[] { proxy.GetType(), otherProxy.GetType() }, PreserveObjectReferences = true
                });
                var deserialized = DeserializeWithDatacontractSerializer(proxy, serializer);

                Assert.Same(proxy.GetType(), deserialized.GetType());
                Assert.Equal(77, deserialized.Id);
                Assert.Equal(88, deserialized.MeComplexTypeS.Number);
            }
        }
        public void Lazy_loading_proxy_can_be_data_contract_deserialized_with_resolver_when_running_under_full_trust()
        {
            using (var context = new ProxiesContext())
            {
                var proxy = context.MeLazyLoads.Create();
                Assert.False(proxy is IEntityWithRelationships);

                proxy.Id = 77;
                proxy.MeComplexTypeS.Number = 88;

                var serializer = new DataContractSerializer(
                    typeof(MeLazyLoadS), new DataContractSerializerSettings {
                    PreserveObjectReferences = true, DataContractResolver = new ProxyDataContractResolver()
                });
                var deserialized = DeserializeWithDatacontractSerializer(proxy, serializer);

                // Resolver returns non-proxy type
                Assert.IsType <MeLazyLoadS>(deserialized);
                Assert.Equal(77, deserialized.Id);
                Assert.Equal(88, deserialized.MeComplexTypeS.Number);
            }
        }
        public void Graph_serialization_preserves_related_entities_deserialized_with_data_contract_deserializer()
        {
            using (var context = new ProxiesContext())
            {
                var proxy      = context.MeLazyLoads.Create();
                var otherProxy = context.MeTrackChanges.Create();

                proxy.Id             = 77;
                otherProxy.Id        = 99;
                proxy.MeTrackChanges = otherProxy;

                var serializer = new DataContractSerializer(
                    typeof(MeLazyLoadS), null, int.MaxValue, false, true, null, new ProxyDataContractResolver());
                var deserialized = DeserializeWithDatacontractSerializer(proxy, serializer);

                // Resolver returns non-proxy type
                Assert.IsType <MeLazyLoadS>(deserialized);
                Assert.Equal(77, deserialized.Id);
                Assert.IsType <MeTrackChangesS>(deserialized.MeTrackChanges);
                Assert.Equal(99, deserialized.MeTrackChanges.Id);
            }
        }
        public void Graph_serialization_works_with_simple_entity_cycle()
        {
            using (var context = new ProxiesContext())
            {
                var children = new MeSimpleEntitiesS[2];
                MeSimpleEntitiesS[] deserializedChildren;
                var childProxy1 = context.MeSimpleEntities.Create();
                var childProxy2 = context.MeSimpleEntities.Create();
                var parentProxy = context.MeSimpleEntities.Create();

                children[0]        = childProxy1;
                children[1]        = childProxy2;
                childProxy1.Id     = 77;
                childProxy2.Id     = 88;
                parentProxy.Id     = 99;
                childProxy1.Parent = parentProxy;
                childProxy2.Parent = parentProxy;
                parentProxy.Children.Add(childProxy1);
                parentProxy.Children.Add(childProxy2);

                var deserialized = DeserializeFromBinaryFormatter(childProxy1);

                Assert.Same(childProxy1.GetType(), deserialized.GetType());
                Assert.Equal(77, deserialized.Id);
                Assert.Equal(99, deserialized.Parent.Id);
                Assert.Equal(2, deserialized.Parent.Children.Count);
                Assert.True(deserialized.Parent.Children.Contains(deserialized));

                deserializedChildren = deserialized.Parent.Children.ToArray();

                for (int i = 0; i < children.Length; i++)
                {
                    Assert.Same(children[i].GetType(), deserializedChildren[i].GetType());
                    Assert.Equal(children[i].Id, deserializedChildren[i].Id);
                    Assert.Equal(deserializedChildren[i].Parent, deserialized.Parent);
                }
            }
        }
        public void Simple_entities_can_be_binary_serialized_when_running_under_full_trust()
        {
            using (var context = new ProxiesContext())
            {
                var proxy = context.MeSimpleEntities.Create();
                Assert.False(proxy is IEntityWithRelationships);

                proxy.Id   = 77;
                proxy.Name = "Entity";
                proxy.MeComplexTypeS.Number = 88;
                proxy.Geometry = DbGeometry.FromText("POINT (30 10)");
                proxy.Enum     = MeSimpleEntitiesS.EnumType.ZERO;

                var deserialized = DeserializeFromBinaryFormatter(proxy);

                Assert.Same(proxy.GetType(), deserialized.GetType());
                Assert.Equal(77, deserialized.Id);
                Assert.Equal("Entity", deserialized.Name);
                Assert.Equal(88, deserialized.MeComplexTypeS.Number);
                Assert.Equal(DbGeometry.FromText("POINT (30 10)").AsText(), deserialized.Geometry.AsText());
                Assert.Equal(MeSimpleEntitiesS.EnumType.ZERO, deserialized.Enum);
            }
        }