これは、「Code First」アプローチでのコーディングに慣れるために私が行ってきた小さな演習です。「控えめに」「データベースファースト」にすれば、実際にはもっと早く設定できただろうと思いますが、そうすると、この新しいものを味わうことができなかったので、試してみたいと思いました。アプリケーションで必要なエンティティは次のとおりです。
- アイテム (ほとんどタイトル、説明、ID のみ、追加情報が続く場合があります)
- ItemPrice (タイトルが示すように、これは特定の時点でのアイテムの価格を表すため、アイテムを参照し、DateTime 値と価格の Decimal を格納できる必要があります)
- ItemRecipe (これには、アイテムを作成できる方法が含まれています。アイテムを構築する方法はさまざまです。そのため、これは Item クラス自体の一部ではないため、ターゲット アイテムとタプルのリスト [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; }
}
では、これをどのように設定する必要があるかを誰かに教えてもらえますか? また、このタプルのリストに、その項目部分がリストに 2 回出現してはならない既存の項目を実際に参照していることをどのように伝えればよいでしょうか? これは、データ注釈のみで行うこともできますか? そうでない場合、何が必要ですか?
基本的に、このプロジェクトの他のエンティティと同様にレシピにアクセスしたいだけです。汎用リポジトリを使用して値を取得/操作します。私が使用する api-controllers には単純な Get-/Post-/Put-/Delete-method があるだけなので、レシピを更新または作成するには、それをオーバーライドします (材料アイテムの量を 1 つずつ挿入するのではなく)。