无法隐式转换类型“Item”“System.Collections.Generic.ICollection

本文关键字:Item Generic Collections ICollection System 转换 类型 | 更新日期: 2023-09-27 18:36:30

我有一个使用实体框架构建的视图模型。生成的代码从报价中带回项目的 ICollec。但是,我在将视图模型更改回模型时遇到问题。

我想检索报价中的项目。

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

我不明白我做错了什么。我有一个项目列表,我添加第一个实例,然后选择第一个项目视图模型。

感谢您的阅读

编辑 - 根据要求

项目视图模型:

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;}
}

引用:

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
        };
    }
}

无法隐式转换类型“Item”“System.Collections.Generic.ICollection<Item>”

ItemViewModelFactory 中的ToModel返回一个tItem,但tQuote中的tItem实际上是一个ICollection<tItem>

我建议将tItem重命名为tQuote 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做别的事情。

根据评论中的进一步信息进行编辑。

第一个版本:

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

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

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

第二个版本:

tItem = itemList

失败,因为tItem属于 ICollection<tItem> 型,而itemListList<QuoteViewModel>
虽然List<T>实现了ICollection<T>,但List<T>的 T 不等于ICollection<T>的 T,所以这不是一个有效的隐式强制转换。

附带说明:正如其他人指出的那样,您对类型和成员的命名相当不寻常,我怀疑至少部分导致了您的困惑。我建议这里的信息作为这方面的良好帮助来源。

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