c# - 使用多个模型通过实体框架创建新记录
问题描述
我创建了一个包含多个模型的视图(通过 ViewModel)来显示来自多个表的数据(即帐单地址、送货地址、订单的行项目)。在我的示例中,我想单击提交按钮以基本上下订单,其中只需要传递部分信息并将其存储到新表(订单)中,假设账单地址 ID 被引用以保留很简单。
在第二步中,我将尝试获取在订单表中创建的新行的 ID 以更新另一个(行项目表)。但是,出于某种原因,我什至无法在订单表中创建记录 - 因此感谢您的帮助!
在我的控制器下方 - 在 ModelState 验证工作之前的所有内容,在它中断并给我一个“对象引用未设置为对象的实例”错误之后......
// POST: /Shop/CreateOrder
[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SubmitOrder(CreateOrderViewModel model)
{
// define variables
var userID = User.Identity.GetUserId();
DateTime nowUTC = DateTime.Now.ToUniversalTime();
DateTime nowLocal = DateTime.Now.ToLocalTime();
int NumberOfLineItems = DATADB.LineItemList.Where(x => x.OrderNumber == 0 && x.UserID == userID).Count();
decimal OrderAmount = DATADB.LineItemList.Where(x => x.OrderNumber == 0 && x.UserID == userID).Sum(x => x.TotalPrice);
if (ModelState.IsValid)
{
var order = new Orders
{
UserID = userID,
ShippingAddressID = model.ShippingAddressModel.ID,
NumberOfLineItems = NumberOfLineItems,
OrderAmount = OrderAmount,
PaymentMethodID = model.PaymentMethodModel.ID,
OrderDate = nowUTC,
OrderLatitude = model.OrdersModel.OrderLatitude,
OrderLongitude = model.OrdersModel.OrderLongitude,
OrderLocation = model.OrdersModel.OrderLocation
};
DATADB.OrderList.Add(order);
DATADB.SaveChanges();
int orderID = order.ID;
var lineItems = DATADB.LineItemList.Where(x => x.OrderNumber == 0 && x.UserID == userID);
lineItems.ForEach(l => l.OrderNumber = orderID);
DATADB.SaveChanges();
return View("Home", "Home");
}
else
{
return View(model);
}
}
视图模型如下所示:
public class CreateOrderViewModel
{
public Orders OrdersModel { get; set; }
public LineItems LineItemModel { get; set; }
public IEnumerable<LineItems> LineItemListModel { get; set; }
public ShippingAddressesViewModel ShippingAddressModel { get; set; }
public ProfileInformationViewModel ProfileInformationModel { get; set; }
public PaymentMethods PaymentMethodModel { get; set; }
}
...和这样的订单模型:
public class Orders
{
public int ID { get; set; }
public string UserID { get; set; }
public int ShippingAddressID { get; set; }
public int NumberOfLineItems { get; set; }
public int PaymentMethodID { get; set; }
public decimal OrderAmount { get; set; }
public decimal ShippingCost { get; set; }
public DateTime OrderDate { get; set; }
public string OrderLatitude { get; set; }
public string OrderLongitude { get; set; }
public string OrderLocation { get; set; }
}
解决方案
您的视图模型CreateOrderViewModel
中包含多个类。在以下代码中,检查空对象方案:
if (ModelState.IsValid)
{
//Check if model.ShippingAddressModel is empty
//Check if model.PaymentMethodModel is empty
//Check if model.OrdersModel is empty
var order = new Orders
{
UserID = userID,
ShippingAddressID = model?.ShippingAddressModel?.ID,
NumberOfLineItems = NumberOfLineItems,
OrderAmount = OrderAmount,
PaymentMethodID = model?.PaymentMethodModel?.ID,
OrderDate = nowUTC,
OrderLatitude = model?.OrdersModel?.OrderLatitude,
OrderLongitude = model?.OrdersModel?.OrderLongitude,
OrderLocation = model?.OrdersModel?.OrderLocation
};
//
//
}
推荐阅读
- deep-learning - 训练 MTCNN 进行人脸检测
- arrays - 从 Google 表格中的单个范围拆分多个范围
- spring-boot - 如何设计在springboot中接受JSON数组作为输入的post api?
- heroku - Heroku烧瓶webapp部署中的requirements.txt vs Pipfile?
- sql - 将列值分隔为行值
- dart - 如何使用 dart 截取特定应用程序?
- apache - Codeigniter 应用程序上的 RewriteRule 和排除问题
- python - 用于移动物体的 Aruco 标记姿势估计 opencv
- javascript - 在 JS 中映射 laravel 验证器错误
- java - 在邮递员中生成的客户端代码与邮递员的测试响应不匹配