我想创建一个具有多个属性的复合类,这些属性代表多个实体。它就像一个交易类。然后,我从我的控制器中的ViewModel更新此类的实例化。然后,我想在此类上调用“保存”方法,以保存对类型为entity的属性的任何更改。我试过了它确实有效,但现在不行。我相信我已经丢失了“上下文”,因为如果我直接在控制器中执行它确实有效(下面的选项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:直接从VM保存。我以为我有这个工作,但现在不行。
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 / Model Binding。
public OrderTransaction()
{
myOrder = db.Orders.Where(o => o.OrderId == 44).First();
}
但是我真的需要将一个参数传递给构造函数,即ID,但我不确定如何在需要时执行此操作。
EDIT2:
实际上Option2是最好的,因为我总能确保表单不会将值重置为null,ViewModel可能会为某些实体表示它们,因为它们不在该表单上。因此,人们将检索数据集,映射表单实体忽略任何空值,然后保存这个新对象。
OrderTransaction myOrderTransaction = new OrderTransaction(OrderID);
myOrder.InjectFrom<IgnoreNulls>(MyVM.myFormOrder);
myOrder.Save();
不幸的是,上面的内容不起作用,因为上下文已从ViewModel发生了变化,这是一种耻辱。
答案 0 :(得分:1)
您必须将复合类转换为Orders实体。添加一个重载构造函数:
public OrderTransaction(vmodel myVM)
{
//then convert myVM to a order class here, add it to context then call db.SaveChanges
}