保存OrderItem时ASP.Net Mvc3编辑订单表生成错误

时间:2012-04-12 02:29:39

标签: asp.net-mvc-3 nhibernate s#arp-architecture

我对NHibernate和ASP.NET MVC都很陌生,所以请原谅我,如果我做错了。但基本上我要做的就是为订单创建一个编辑表单。

我在ASP.NET MVC3中使用C#和NHibernate。

基本上我有多对多的关系,其中链接表有一些额外的字段。我知道如何在使用覆盖的nhibernate的s#arp架构中进行常规的多对多,但我不确定如何在链接表中包含额外的字段。

更具体地说,我将Orders链接到Editions,链接表称为OrderItems。 OrderItems表还有另一个名为LimitedEditionSerial的外键。

我为OrderItems(链接表)创建了一个Model类和一个Cud Tasks类,但不是一个控制器和一个视图,因为它不应该有一个。这是Order控制器中我的Edit方法的代码。

public ActionResult Edit(EditOrderViewModel orderModel)
    {
        Order order = orderModel.Order;
        int[] TempEditionIds = orderModel.TempEditionIds ;
        int[] TempSerials = orderModel.TempSerials ;
        if (ModelState.IsValid)
        {
            order.Customer = _customerRepository.Get(order.Customer.Id);
            order.OrderItems = new List<OrderItem>();
            for (int i = 0; i < TempEditionIds.Length; i++)
            {
                OrderItem item = new OrderItem();

                item.Order = _orderRepository.Get(order.Id);
                item.Edition = _editionRepository.Get(TempEditionIds[i]);
                if (TempSerials[i] != 0)
                {
                    item.LimitedEditionSerial = _serialRepository.GetAll().Where(o => o.Number == TempSerials[i]).
                        Where(o => o.Edition.Id == TempEditionIds[i]).Single();
                }
                else
                {
                    item.LimitedEditionSerial = null;
                }
                if (item.Edition != null)
                {
                    order.OrderItems.Add(item);
                }
            }
            foreach (OrderItem item in order.OrderItems)
            {
                _itemTasks.SaveOrUpdate(item);
            }
            ActionConfirmation<Order> confirmation = _orderTasks.SaveOrUpdate(order);
            if (confirmation.WasSuccessful)
            {
                TempData["message"] = confirmation.Message;
                return RedirectToAction("Index", "Order");
            }

            ViewData["message"] = confirmation.Message;
        }
        return View(_orderTasks.CreateEditViewModel(order));
    }

无论如何,由于某种原因,这给了我一个'不能将值NULL插入'OrderFk'列,表'Frameworker2.dbo.OrderItems';列不允许空值。更新失败。 该语句已终止。'更新错误。创建工作正常,但更新给我这个错误。我很欣赏任何有关如何修复此错误的解决方案,但如果您有更好的方法来处理链接表中额外字段的多对多关系,我也希望听到。我知道我可能完全错了

编辑:这是我的订单实体

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SharpLite.Domain;

namespace FrameWorker2.Domain
{
public class Order : Entity
{
    public virtual Customer Customer { get; set; }
    public virtual SalesPerson SalesPerson { get; set; }
    public virtual Address ShippingAddress { get; set; }
    public virtual Address BillingAddress { get; set; }
    public virtual IList<OrderItem> OrderItems { get; set; }

    public Order()
    {
        //This just prevents the possibility of a null list exception.
        OrderItems = new List<OrderItem>();
    }
    public virtual Location Location { get; set; }

    public virtual DateTime DateOrdered { get; set; }
    public virtual DateTime DatePromised { get; set; }
    public virtual DateTime DateFramed { get; set; }
    public virtual DateTime DateCompleted { get; set; }
    public virtual DateTime DatePaidInFull { get; set; }


}
}

0 个答案:

没有答案