为什么我不能让这个模型映射到这个视图模型?

时间:2018-03-31 08:09:47

标签: c# asp.net-core-mvc entity-framework-core

我有一个递归结构类别树的实体模型:

public class ProductCategory
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Title { get; set; }
    public int SortOrder { get; set; }

    public ProductCategory ParentCategory { get; set; } //nav.prop to parent
    public ICollection<ProductCategory> Children { get; set; } = new List<ProductCategory>();
    public ICollection<ProductInCategory> ProductInCategory { get; set; }
    public ICollection<FrontPageProduct> FrontPageProduct { get; set; } // Nav.prop. to front page product

    // Recursive sorting:
    public void RecursiveOrder()
    {
        Children = Children.OrderBy(o => o.SortOrder).ToList();
        Children.ToList().ForEach(r => r.RecursiveOrder());
    }
}

......据说匹配ViewModel:

public class ViewModelProductCategory
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Title { get; set; }
    public int SortOrder { get; set; }
    public bool Checked { get; set; } // Used for assigning a product to multiple categories in Product/Edit

    // Nav.props:
    public ViewModelProductCategory ParentCategory { get; set; } // Nav.prop. to parent
    public ICollection<ViewModelProductCategory> Children { get; set; } // Nav.prop. to children
    public IEnumerable<ViewModelProduct> Products { get; set; } // Products in this category
    public IEnumerable<ViewModelFrontPageProduct> FrontPageProducts { get; set; }

    public string ProductCountInfo { get { return Products?.Count().ToString() ?? "0"; } }
}

当我尝试填充viewmodel时,如下所示:

List<ProductCategory> DbM = 
    await _context.ProductCategories
        .Include(c => c.Children)
        .Where(x => x.ParentId == null)
        .OrderBy(o => o.SortOrder)
        .ToListAsync();
foreach (var item in DbM)
{
    VMSelectCategories.Add(
        new ViewModelProductCategory{
            Id = item.Id,
            Children = item.Children,
            Title = item.Title
        });
}

VisualStudio尖叫我无法将ProductCategory隐式转换为ViewModelCategory。这发生在Children = item.Children

为什么不工作?我不能在视图模型中使用与原始实体模型无关的其他属性吗?与CheckedProductCountInfo一样?

1 个答案:

答案 0 :(得分:1)

在这一行:

Children = item.Children,

ChildrenViewModelProductCategory.Children属性,类型为ICollection<ViewModelProductCategory>,而item.ChildrenProductCategory.Children属性,类型为ICollection<ProductCategory>。它们是不同的类型,既不继承也不实现另一个,那么为什么你希望能够将一种类型的对象分配给另一种类型的属性?你希望这可行吗?

var list1 = new List<int> {1, 2, 3};
List<string> list2 = list1;

当然不是(我希望)因为将List<int>对象分配给List<string>变量会很愚蠢。你要做的事情是完全一样的。您需要提供一些方法来从一种类型转换为另一种类型,然后在您的代码中实现它。一个选项可能是这样的:

Children = item.Children.Select(pc => MapToViewModel(pc)).ToList(),

其中MapToViewModel是您编写的方法,用于创建ViewModelProductCategory并从ProductCategory参数填充其属性。

您可能还会考虑使用类似AutoMapper的内容。