无法隐式转换类型 '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
失败,因为 tItem
是 ICollection<tItem>
类型,而 itemList
是 List<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
做其他事情。
我有一个使用 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
失败,因为 tItem
是 ICollection<tItem>
类型,而 itemList
是 List<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
做其他事情。