2015-09-24 11 views
0

У меня есть модель в структуре сущности с родительскими отношениями с дочерними элементами в одной таблице. Это отображение от 0,1 до многих. Теперь у него много свойств, по одному сценарию мне не нужны все эти свойства, просто Id, Name и Children.EF cast для просмотра структуры дерева моделей

public partial class Foo 
{ 
    public Foo() 
    { 
     this.As = new HashSet<A>(); 
     this.Children = new HashSet<Foo>(); 
     this.Bs = new HashSet<B>(); 
    } 

    public int FooId { get; set; } 
    public Nullable<int> ParentId { get; set; } 
    public string ParentName { get; set; } 
    public string Name { get; set; } 
    //... many more 

    public virtual ICollection<A> As { get; set; } 
    public virtual ICollection<Foo> Children { get; set; } 
    public virtual Foo Foo2 { get; set; } 
    public virtual ICollection<B> Bs { get; set; } 
} 

Я хочу, чтобы список этих конвертированный в

public class FooModel 
{ 
    public FooModel() 
    { 
     this.Children = new HashSet<FooModel>(); 
    } 

    public int FooId { get; set; } 
    public Nullable<int> ParentId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<FooModel> Children { get; set; } 
    public virtual FooModel Foo2 { get; set; } 
} 

Я делаю, как показано ниже.

db.Foos.Where(p => p.ParentId == null).Cast<FooModel>().ToList(); 

и получать ошибки

Невозможно привести объект типа 'System.Data.Entity.DynamicProxies.Foo_ALongNoInHexadecimal' к типу 'Namespace.ViewModel.FooModel.

Есть ли способ бросить древовидную структуру для просмотра модели дерева?

ответ

3

Метод расширения Cast<> не использует определяемые пользователем преобразования, если у вас есть один определенный. Он может использоваться только для интерфейсов или внутри иерархической иерархии класса поставляемого типа.

Попробуйте определить конструктор, который принимает вашу модель, например.

public class FooModel 
{ 
    public FooModel(Foo myFoo) 
    { 
     this.Children = new HashSet<FooModel>(); 
     if(myFoo != null) 
     { 
      FooId = myFoo.FooId; 
      ParentId = myFoo.ParentId; 
      Name = myFoo.Name; 
      //Foo2 = new FooModel(myFoo.Foo2); 
      Childern = myFoo.Children.Select(c=> new FooModel(c)); 
     } 
    } 

    public int FooId { get; set; } 
    public Nullable<int> ParentId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<FooModel> Children { get; set; } 
    public virtual FooModel Foo2 { get; set; } 
} 

использовать его:

db.Foos.Where(p => p.ParentId == null).Select(c => new FooModel(c)).ToList(); 
+0

Получение нулевого ссылочное исключения в конструкторе –

+0

и System.StackOverflowException»на добавление Condtion для если модели не нулевой –

+1

хорошо, вы должны проверить нулевые объекты в конструкторе, попробуйте удаление Foo2 = новой строки FooModel (myFoo.Foo2) – Overmachine