我对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; }
}
}