2017-11-26 1 views
0

에서 나는이 개 수업이 : 내부 나는이 방법을 사용하고C# XmlSerializer를 엔티티 프레임 워크

[XmlInclude(typeof(Item))] 
public class A 
{ 
    public int Id { get; set; } 

    [XmlArray("Items")] 
    [XmlArrayItem("Item")] 
    public virtual List<Item> Items { get; set; } = new List<Item>(); 
} 

public class Item 
{ 
    public int Id { get; set; } 
    [XmlIgnore] 
    public virtual A a { get; set; } 
} 

을 내 DbContext :

Type[] types = { typeof(Item) }; 

var aElements = GetA().ToList(); 

System.Xml.Serialization.XmlSerializer writer = 
    new System.Xml.Serialization.XmlSerializer(aElements.GetType(), types); 

writer.Serialize(file, aElements); 
:
public virtual DbSet<A> A { get; set; } 

public IQueryable<A> GetA() 
{ 
     return A; 
} 

가 지금은 XML로 데이터를 내보낼

그리고 오류가 발생합니다 :

InvalidOperationException: The type System.Data.Entity.DynamicProxies.A_08D7BCCB892E27DE8C32342A0E8F0F2B2D3B9E2DAC9F6A16 was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

무엇이 잘못 되었나요? 유사한 주제를 검색하려고했지만 그 해결책은 나에게 도움이되지 않습니다.

편집 : 예상 된 결과 :

<A> 
    <Id>1</Id> 
    <Items> 
    <Item><Id>20</Id></Item> 
    </Items> 
</A> 
<A> 
    .. 
</A> 
+0

좋아요. 실수가 없습니다. 당신이 제공하지 않은 다른 세부 사항이 있습니까? – lucky

+0

거의 모든 것, 그 클래스는 더 많은 속성을 가지고 있지만 기본 유형 – dontHaveName

답변

1

당신은 아마 오류가 있습니다. XmlSerializer는 동적으로 생성 된 프록시 형식을 기대하지 않으므로 오류가 발생합니다.

아마도이 항목 컬렉션 속성에 대한 지연로드를 돌려서이 문제를 해결할 수 있습니다. 지연로드를 해제하면 Items 컬렉션이 항상 채워지므로 일부 경우에 예기치 않은 성능 저하가 발생할 수 있습니다.

+0

예, 방금 알아 냈습니다. 난 그냥 그것을 해제하고 수동으로 항목을 포함해야합니다. 그렇지 않으면 게으른 로딩 루프가 발생합니다. – dontHaveName

0

아마도해야한다; 엔티티 프레임 워크는 지연로드를 지원하기 위해 항목에 프록시가있는 항목의 컬렉션을 대체하기 때문에

public virtual DbSet<A> A{ get; set; } 
public IQueryable<A> GetA() 
{ 
     return A.AsNoTracking(); 
} 
+0

은 이미 시도했지만 동일한 오류 만 있습니다. 나는 또한 내 질문을 업데이 트, 나는 클래스의 목록을 연재 중입니다. – dontHaveName

+0

효과가 있습니다. 따라서 프록시 생성을 해제 해보십시오. DbContext.Configuration.ProxyCreationEnabled = false; – lucky

+0

또한 이미 시도했습니다. 오류는 발생하지 않지만 은 비어 있습니다. – dontHaveName