I finally decided to solve this, but requires editing the generated classes :(
Create POCO entity classes, set Lazy Loading to true to get the parent and all children with the same select (without the need for Include or Load).
In the parent class, change the type of the child accessor from ICollection to FixupCollection.
public virtual agreement FixupCollectionItemLogs
Then in the XmlSerializer you must specify the parent type and child types from the proxy classes.
var agreement = storeops.Agreements.Include("AgreementItems").SingleOrDefault(a => a.AgreementNumber == AgreementTextBox.Text); var typeList = new List<Type>(); if(agreement.AgreementItems.Count > 0) typeList.Add(agreement.AgreementItems.FirstOrDefault().GetType()); if (agreement.AgreementItemLogs.Count > 0) typeList.Add(agreement.AgreementItemLogs.FirstOrDefault().GetType()); if (agreement.AgreementPricings.Count > 0) typeList.Add(agreement.AgreementPricings.FirstOrDefault().GetType()); if (agreement.AgreementSnapshots.Count > 0) typeList.Add(agreement.AgreementSnapshots.FirstOrDefault().GetType()); if (agreement.AgreementTransactions.Count > 0) typeList.Add(agreement.AgreementTransactions.FirstOrDefault().GetType()); if (agreement.AgreementTransactionLogs.Count > 0) typeList.Add(agreement.AgreementTransactionLogs.FirstOrDefault().GetType()); XmlSerializer serializer = new XmlSerializer(agreement.GetType(), typeList.ToArray()); XmlWriter writer = XmlWriter.Create("Agreement.xml"); serializer.Serialize(writer, agreement);
source share