2013-10-14 4 views
2

Может ли кто-нибудь помочь мне с нижеследующим?Сериализация объекта XML - добавить метод

Модели

public class Integer 
{ 
    public int IntegerID { get; set; } 

    [Required(ErrorMessage = "Enter an integer")] 
    [Integer(ErrorMessage = "Enter an integer")] 
    public int IntegerValue { get; set; } 
    public int IntegerListID { get; set; } 

    public virtual IntegerList IntegerList { get; set; } 
} 

public class IntegerList 
{ 
    public int IntegerListID { get; set; } 
    public string Direction { get; set; } 
    public long Performance { get; set; } 
    public virtual ICollection<Integer> Integers { get; set; } 

    public IntegerList() 
    { 
     Integers = new List<Integer>(); 
    } 
} 

Действие контроллера

public ActionResult XMLexport() { 
     Object obj = db.IntegerLists.Include("Integers"); 
     Serialize(obj); 
     return View(); 
    } 
    public static string Serialize(Object obj) 
    { 
     DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); 
     MemoryStream memoryStream = new MemoryStream(); 
     serializer.WriteObject(memoryStream, obj); 
     return Encoding.UTF8.GetString(memoryStream.GetBuffer()); 
    } 

На линии

serializer.WriteObject(memoryStream, obj); 

я получаю ошибку:

Type 'System.Data.Entity.Infrastructure.DbQuery`1[[IntegerSorter.Models.IntegerList,  IntegerSorter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' is an invalid collection type since it does not have a valid Add method with parameter of type 'IntegerSorter.Models.IntegerList'. 

Может кто-нибудь посоветует мне, где и как реализовать метод Add?

Update:

Изменение:

Object obj = db.IntegerLists.Include("Integers"); 

к

Object obj = db.IntegerLists.Include("Integers").ToList(); 

результаты в:

Type 'System.Data.Entity.DynamicProxies.IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200' with data contract name 'IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer. 

ответ

2

Попробуйте изменить эту строку:

Object obj = db.IntegerLists.Include("Integers");

Для этого:

Object obj = db.IntegerLists.Include("Integers").ToList();

Это вызовет запрос к базе данных для запуска и дать вам List<IntegerList> вместо DbQuery<IntegerList>. Затем это должно обеспечить то, что хочет сериализатор (поскольку он имеет метод Add(IntegerList), доступный по запросу).

+0

Вопрос обновлен на основе этого ответа – user1405195

0

Я принял ответ Грэга, но чувствую, что я должен подробно последующие вопросы, которые я должен был работать через:

Type 'System.Data.Entity.DynamicProxies.IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200' with data contract name 'IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer. 

была решена:

Context.Configuration.ProxyCreationEnabled = false; 

, а затем:

Object graph for type 'System.Collections.Generic.List`1[[IntegerSorter.Models.Integer, IntegerSorter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' contains cycles and cannot be serialized if reference tracking is disabled. 

был решён путем украшения свойства навигации в классе Integer, как показано ниже:

[IgnoreDataMember] 
public virtual IntegerList IntegerList { get; set; }