是否可以使用复合类实体,更新这些属性,然后将复合对象保存到数据库?

时间:2013-04-27 22:55:11

标签: asp.net-mvc-3 asp.net-mvc-4 entity-framework-4 entity-framework-5

我想创建一个具有多个属性的复合类,这些属性代表多个实体。它就像一个交易类。然后,我从我的控制器中的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发生了变化,这是一种耻辱。

1 个答案:

答案 0 :(得分:1)

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

public OrderTransaction(vmodel myVM)
{

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

}