我有一个使用实体框架构建的视图模型。生成的代码从报价中带回项目的 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
};
}
}
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>
型,而itemList
是List<QuoteViewModel>
。
虽然List<T>
实现了ICollection<T>
,但List<T>
的 T 不等于ICollection<T>
的 T,所以这不是一个有效的隐式强制转换。
附带说明:正如其他人指出的那样,您对类型和成员的命名相当不寻常,我怀疑至少部分导致了您的困惑。我建议这里的信息作为这方面的良好帮助来源。
此外,您似乎确实以一种相当复杂的方式进行了讨论,但这不是问题的重点,所以我不会进一步讨论。