无法隐式转换类型 'Item' 'System.Collections.Generic.ICollection<Item>'。存在显式转换(您是否缺少转换?)

Cannot implicitly convert type 'Item' 'System.Collections.Generic.ICollection<Item>'. An explicit conversion exists (are you missing a cast?)

我有一个使用 entity framework 构建的视图模型。生成的代码从报价中带回项目的 ICollection。但是,我无法将视图模型改回模型。

我想检索报价中的项目。

public tQuote ToModel (QuoteViewModel quoteViewModel )
    {
        List<ItemViewModel> itemList = new List<ItemViewModel>();
        itemList.Add(quoteViewModel.Item); 

        return new tQuote()
        {
            QuotePK = quoteViewModel.QuoteID,
            QuoteNumber = quoteViewModel.QuoteReference,
            QuoteReqDate = quoteViewModel.QuoteReqDateTime,
            tItem = itemViewModelFactory.ToModel(itemList.FirstOrDefault())
        };
    }

我不明白我做错了什么。我有一个项目列表,我添加了第一个实例,然后 select 第一个 ItemViewModel。

感谢阅读

编辑 - 根据要求

项目视图模型:

public class ItemViewModel : DataViewModel
{
    public ItemViewModel()
    { }

    public int ItemID { get; set; }
    public int? QuoteID { get; set; }
    public string Title { get; set; }
    public QuoteViewModel Quote { get; set;}

}

t引用:

public partial class tQuote
{
    public tQuote()
    {
        this.tItem = new HashSet<tItem>();
    }

    public virtual ICollection<tItem> tItem { get; set; }
}

项目视图模型工厂:

public class ItemViewModelFactory : IItemViewModelFactory
{
    private readonly IQuoteViewModelFactory quoteViewModelFactory; 

    public ItemViewModelFactory(IQuoteViewModelFactory quoteViewModelFactory)
    {
        this.quoteViewModelFactory = quoteViewModelFactory;
    }

    public ItemViewModel ToViewModel (tItem tItem)
    {
        return new ItemViewModel()
        {
            ItemID = tItem != null ? tItem.ItemPK : 0,
            QuoteID = tItem != null ? tItem.QuoteFK : 0,
            Title = tItem != null ? tItem.Title : "",
            Quote = tItem.tQuote != null ? quoteViewModelFactory.ToViewModel(tItem.tQuote) : new QuoteViewModel()
        };
    }

    public tItem ToModel (ItemViewModel itemViewModel )
    {
        return new tItem()
        {
            ItemPK = itemViewModel.ItemID,
            QuoteFK = itemViewModel.QuoteID,
            Title = itemViewModel.Title
        };
    }
}

根据评论中的更多信息进行编辑。

第一个版本:

tItem = itemViewModelFactory.ToModel(itemList.FirstOrDefault())

失败是因为 ToModel 方法 returns 单个 tItem 当然不能隐式转换为 ICollection<tItem>。您需要创建一个新的集合对象(实现 ICollection<tItem> 的对象,例如 List<tItem>)并将其传递给 tItem。例如:

tItem = new List<tItem>(itemViewModelFactory.ToModel(itemList.FirstOrDefault()))

第二个版本:

tItem = itemList

失败,因为 tItemICollection<tItem> 类型,而 itemListList<QuoteViewModel>.
尽管 List<T> 实现了 ICollection<T>,但您的 List<T> 的 T 不等于您的 ICollection<T> 的 T,因此这不是有效的隐式转换。

旁注:正如其他人所指出的,您对类型和成员的命名非常不合常规,我怀疑这至少在一定程度上导致了您的困惑。我建议将信息 here 作为一个很好的帮助来源。

此外,您似乎确实以一种相当复杂的方式来解决这个问题,但这不是问题的重点,所以我不会进一步讨论。

ToModel in ItemViewModelFactory returns一个tItem,但是tItem in tQuote实际上是一个ICollection<tItem>

我建议将 tQuote 中的 tItem 重命名为 tItems 以便清楚地表明它不是一个单独的项目。

此外,在方法 public tQuote ToModel (QuoteViewModel quoteViewModel) 中,您需要将 tItem = itemViewModelFactory.ToModel(itemList.FirstOrDefault()) 更改为 tItem = new new HashSet<tItem>{ itemViewModelFactory.ToModel(itemList.FirstOrDefault()) }。如果我是你,我会将 itemList.FirstOrDefault() 更改为 quoteViewModel.Item,除非你先用 itemList 做其他事情。