继承属性和EF代码优先动态代理

时间:2013-01-15 16:57:59

标签: .net xml-serialization xmlserializer

我的问题与this问题有关。 我有一个POCO类,具有从子项到父项的虚拟导航属性。父母有一群孩子。

public class Parent
{
    public virtual List<Child> Children { get; set; }
}

public class Child
{
    public string ParentID { get; set; }

    [XmlIgnore]
    [ForeignKey("ParentID")]
    public virtual Parent Parent { get; set; }
}

现在......你猜对了 - 我尝试使用XmlSerializer序列化来自EF(即代理)的父代。它首先抱怨我以某种方式处理的所有未知类型(动态生成的类)。但随后它出现了“循环引用”异常。

经过一些调查后发现原因是XmlIgnore属性不能通过对代理对象的Parent属性的反射来发现。

    Type.GetType("System.Data.Entity.DynamicProxies.Child_2C9351FD5E156D94E5BF2C68DABFC2A956181C99A0C2E4E6B592E6373D8645ED, EntityFrameworkDynamicProxies-Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
.GetProperty("Parent").GetCustomAttributes(typeof(XmlIgnoreAttribute), true) <-- returns 'None'

代理对象的类型基类型是我的Child类。 XmlIgnoreAttribute未设置Inherited标志,默认值为true,因此这应该有效。发生了什么事?

代理对象是否在于它的基类型?

如何在不编写“手动”xml序列化的情况下解决此问题(我需要使用XmlSerializer)。

更新: 事实证明,XMLSerializer不尊重看似错误的属性的“继承性”。这是一个错误还是设计?

1 个答案:

答案 0 :(得分:0)

根据this msdn文章(备注部分):

'此方法忽略属性和事件的inherit参数。要在继承链中搜索属性和事件的属性,请使用Attribute.GetCustomAttributes方法的相应重载。'

所以这不需要对代理做任何事情。看一下这个例子:

public class Test
{
    [XmlIgnore]
    public virtual int Property { get; set; }
}

public class Derived : Test
{
    public override int Property { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(
            typeof(Derived)
           .GetProperty("Property")
           .GetCustomAttributes(typeof(XmlIgnoreAttribute), true)
           .Count());

        Console.WriteLine(
           Attribute.GetCustomAttributes(
               typeof(Derived)
              .GetProperty("Property"), true)
              .Count());
    }
}

和结果:

0
1
Press any key to continue . . .