排除在EF6中序列化的虚拟属性

时间:2018-04-18 11:54:00

标签: entity-framework serialization

我有这个实体类:

 public class Foo{
        [Key]
        [Column("ENT_ID")]
        public int Id { set; get; }

        .....

        [NotMapped]
        public virtual Employee Employee{ set; get; }

        [NotMapped]
        public virtual List<Car> Cars{ set; get; }

        [NotMapped]
        public virtual List<Book> Books{ set; get; }

        public Foo()
        {
            Books= new List<Book>();
            Cars= new List<Car>();
        }
    }

我想从序列化中排除虚拟属性,使用[NotMapped]工作,但我无法导航到这个属性! 我试图使用[XMLIgnore]但没有帮助。

我使用这个序列化类:

public class XmlSerializer<T> where T : class
    {
        public static string Serialize(T data)
        {
            var sw = new StringWriter();
            var xmlSerializer = new XmlSerializer(typeof(T));
            xmlSerializer.Serialize(sw, data);
            return sw.ToString();
        }

        public static T Deserialize(string data)
        {
            var ser = new XmlSerializer(typeof(T));
            var sr = new StringReader(data);
            return (T)ser.Deserialize(sr);
        }
    }

如何从序列化中排除虚拟属性并仍然将它们用作导航属性?

1 个答案:

答案 0 :(得分:0)

您需要在序列化之前从实体中删除生成的代理。要在没有EF生成代理的情况下获取对象,您必须禁用代理创建,然后将其转换为对象。像这样:

dbCcontext.Configuration.ProxyCreationEnabled = false;
Foo foo = dbContext.Entry(fooLoadedWithEF).CurrentValues.ToObject() as Foo;
// Do your serialization of 'foo'

不要忘记之后将ProxyCreationEnabled设置回原来的值。

这是一个不错的方法,可以在这里解答有关删除代理的问题:https://stackoverflow.com/a/25774651/31722