我想创建一个具有代表多个实体的多个属性的复合类。它就像一个事务类。然后,我从控制器中的 ViewModel 更新此类的实例化。然后我想在这个类上调用一个“保存”方法来保存对实体类型属性的任何更改。我已经尝试过了,它确实有效,但现在无法正常工作。我相信我已经丢失了“上下文”,因为如果我直接在控制器中执行它,它确实可以工作(下面的选项 3)。
这是我班级的一些代码。这有点做作。这是我感兴趣的原理,即使用文档/事务类来保存多个实体数据:
public class OrderTransaction
{
public OrderEntities db = new OrderEntities();
public int OrderId { get; set; }
private entityOrder _myOrder;
public entityOrder myOrder
{
get
{
return this._myOrder;
}
set
{
this._myOrder= value;
}
}
private List<entityOrderItem> _myOrderItems;
public List<entityOrderItem> myOrderItems
{
get
{return this._myOrderItems;}
set
{this._myOrderItems = value;}
}
public Boolean Load(int OrderId = 1)
{
if (db.entityOrder.Where(o => o.OrderId == OrderId).Any())
{
myOrder = db.entityOrder.Where(o => o.OrderId == OrderId).First();
}
if (db.entityOrderItem.Where(oi => oi.OrderId == OrderId).Any())
{
myOrderItems = db.entityOrderItem.Where(oi => oi.OrderId == OrderId).ToList();
}
return true;
}
public Boolean Save()
{
if ((db.SaveChanges()) > 0)
{
return true;
}
else
{
return false;
}
}
}
}
如果这个类看起来不错,那么我想我的问题是为什么我不能从控制器获得保存工作
[HttpPost]
public ActionResult Edit(vmodel myVM)
{
选项1:直接从虚拟机中保存。我以为我有这个工作,但不是现在。
vmodel.MyOrderTransaction.Save();
选项2:使用对象映射和保存分配给复合对象
OrderTransaction myOrderTransaction = new OrderTransaction();
myOrderTransaction.injectFrom<IgnorNulls>myVM.MyOrderTransaction
选项 3:在当前上下文中查找特定对象并直接从 VM 和“SaveChanges()”分配值。
var myOrders = db.Orders.where(....
myOrder.Name = "...
db.DaveChanges();
Option3 确实有效,但我没有通过这种方法使用我的复合类。
那么如何让我的复合类方法保存所有单例和列表属性。
非常感谢提前。
编辑
刚刚发现,如果我为在记录中检索的“OrderTransaction”添加一个构造函数,那么 Option1 将起作用,即直接关闭 VM/模型绑定。
public OrderTransaction()
{
myOrder = db.Orders.Where(o => o.OrderId == 44).First();
}
但是,我确实需要将参数传递给构造函数,即 ID,但如果需要,我不确定如何执行此操作。
编辑2:
实际上 Option2 会是最好的,因为我总是可以确保表单不会将值重置为 null,ViewModel 可能代表某些实体,因为它们不在该表单上。因此可以检索数据集,映射表单实体,忽略任何空值,然后保存这个新对象。
OrderTransaction myOrderTransaction = new OrderTransaction(OrderID);
myOrder.InjectFrom<IgnoreNulls>(MyVM.myFormOrder);
myOrder.Save();
不幸的是,由于上下文已从 ViewModel 更改,因此上述方法不起作用,这是一种耻辱。