0

我想创建一个具有代表多个实体的多个属性的复合类。它就像一个事务类。然后,我从控制器中的 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 更改,因此上述方法不起作用,这是一种耻辱。

4

1 回答 1

1

您必须将复合类转换为 Orders 实体。添加一个重载构造函数:

public OrderTransaction(vmodel myVM)
{

    //then convert myVM to a order class here, add it to context then call db.SaveChanges

}
于 2013-04-27T23:30:51.023 回答