0

私は小さなウェブショップを作ることに挑戦していますが、DB に注文を保存する際に問題に直面しました。

これは私の注文クラスです

    [Key]
    public int Id { get; set; }
    public IEnumerable<BasketProduct> BasketProducts { get; set; }
    public string UserName { get; set; }

BasketProducts を格納します (int Id がないと動作したくなかったのですが、なぜそれが必要なのかわかりません)

    public int Id { get; set; }
    public Product Product { get; set; }
    public int Quantity { get; set; }

BasketController で、ユーザーがチェックアウトをクリックした場合、注文を作成して DB に入れたい

public ActionResult CreateOrder()
        {
            //GetCurrentBasket returns a basket of current session
            var baskItems = GetCurrentBasket().Items;

            Order order = new Order { BasketProducts = baskItems, UserName = User.Identity.Name };
            EFDbContext ent = new EFDbContext();
            ent.Orders.Add(order);
            ent.SaveChanges();

            return RedirectToAction("Index", "Checkout", new { order = order });
        }

チェックアウトの Index メソッドでは、 Order オブジェクトを取り、その中のすべての製品を表示するだけです。

       @model Domain.Elements.Order
       //some code omitted
       @foreach (var item in Model.BasketProducts)
       {
          <p>@item.Product.Name</p>
          <p>@item.Quantity</p>
       }

問題は、DB (Order テーブル内) で Id と UserName のみが作成されるため、現在の人が注文した製品を取得できないことです。

私はどのような間違いを犯しましたか、それとも機能させるために何かが欠けているのでしょうか? 前もって感謝します。

編集:これは私が今得たエラーです。オブジェクト参照がオブジェクト インスタンスに設定されていません。

4

1 に答える 1

-1

データベースに保存するときに問題があるようです。エンティティを追加するときは、コンテンツの特定の DbSet にエンティティを追加する必要があると思います。このようなことを試してください:

public ActionResult CreateOrder()
{
    //GetCurrentBasket returns a basket of current session
    var baskItems = GetCurrentBasket().Items;

    var context = new EFDbContext();
    var orders = context.GetDbSet<Order>();

    var order = orders.Create(); //use the DbSet to create your new entity
    order.BasketProducts = baskItems;
    order.UserName = User.Identity.Name;

    orders.Add(order);

    try
    {
        context.SaveChanges();
    }
    catch(DatabaseException ex)
    {
    }

    return RedirectToAction("Index", "Checkout", new { order = order });
 }

Context.SaveChanges() 呼び出しを try/catch でラップしました。私は通常、データベースへの保存でエラーが発生した場合にこれを行います。これにより、デバッグしてステップスルーでき、データベースレベルの例外がキャッチされ、何が起こっているかを確認できます。

于 2012-11-14T03:42:54.013 に答える