【问题标题】:EF cast to view model tree structureEF 转换以查看模型树结构
【发布时间】:2015-09-24 14:24:13
【问题描述】:

我在实体框架中有一个模型,同一张表中有父子关系。它是一个 0,1 到多映射。现在它有许多属性,在一种情况下,我不想要所有这些属性,只需要 Id、Name 和 Children。

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' 输入 '命名空间.ViewModel.FooModel'。

有没有办法将树结构转换为树的视图模型?

【问题讨论】:

    标签: c# entity-framework viewmodel self-referencing-table


    【解决方案1】:

    Cast&lt;&gt; 扩展方法不应用用户定义的转换,如果您定义了一个。它只能转换为接口或提供类型的类层次结构内。

    尝试定义一个接受你的模型的构造函数,例如

    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();
    

    【讨论】:

    • 在构造函数中获取空引用异常
    • 和 System.StackOverflowException' 为 if model not null 添加条件
    • 好吧,你应该检查构造函数中的空对象,尝试删除 Foo2 = new FooModel(myFoo.Foo2) 行
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2022-01-01
    • 2012-02-16
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多