这是我一直在做的一个小练习,用于习惯使用“代码优先”方法进行编码。如果我“保守地”“数据库优先”完成它,我实际上会更快地设置它,我想,但是我不会尝到这种新东西的任何味道,所以我想试一试。这些是我的应用程序中需要的实体:
- 项目(几乎只有标题、描述和 ID,可能会出现其他信息)
- ItemPrice (正如标题所说,这应该代表某个项目在某个时间的价格,因此这需要能够引用一个项目并存储一个日期时间值和一个十进制的价格)
- ItemRecipe(这包含一种可以创建项目的方式,可能有不同的方式来构造一个项目,这就是为什么这不是 Item-class 本身的一部分,所以它引用了一个目标项目和一个元组列表 [of Item/金额对])
现在插入和更新项目和价格,这对我有用,我的问题是食谱;我还不能理解我需要如何编写食谱-POCO(我认为virtual
包含列表甚至可能是错误的)
我写了 POCO 类:
物品:
public class Item
{
public int ID { get; set; }
[Required(ErrorMessage = "Please enter a title for this item.")]
[MaxLength(127)]
public string Title { get; set; }
[Required(ErrorMessage = "Please enter a descriptive text for this item.")]
[MaxLength(4000)]
public string Description { get; set; }
}
商品价格:
[DataContract]
public class ItemPrice
{
public int ID { get; set; }
[Required(ErrorMessage = "You need to select an item for this price.")]
[DataMember(IsRequired = true)]
public int ItemID { get; set; }
[ForeignKey("ItemID")]
public virtual Item Item { get; set; }
[Required(ErrorMessage = "You need to set a price for this item.")]
[DataMember(IsRequired = true)]
public Decimal Price { get; set; }
[Required(ErrorMessage = "You need to provide a date and time for the price for this item.")]
[DataMember(IsRequired = true)]
public DateTime Time { get; set; }
}
项目配方:
[DataContract]
public class ItemRecipe
{
public int ID { get; set; }
[Required(ErrorMessage = "You need to select an item for this recipe.")]
[DataMember(IsRequired = true)]
public int ItemID { get; set; }
[ForeignKey("ItemID")]
public virtual Item TargetItem { get; set; }
public virtual List<Tuple<Item, int>> Ingredients { get; set; }
}
那么谁能指出我需要如何设置它?另外,我如何告诉这个元组列表它的项目部分实际上引用了一个不能在列表中出现两次的现有项目?这甚至可以仅使用数据注释来完成吗?如果不是我需要什么?
基本上我只想像这个项目中的其他实体一样访问配方,我使用通用存储库来检索/操作值。我使用的 api 控制器只有简单的 Get-/Post-/Put-/Delete 方法,因此对于更新或创建食谱,我只需覆盖它(而不是一一插入成分项目数量)。