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

Asp.net mvc 3 是否可以使用实体的复合类,更新这些属性,然后将复合对象保存到数据库?,asp.net-mvc-3,asp.net-mvc-4,entity-framework-4,entity-framework-5,Asp.net Mvc 3,Asp.net Mvc 4,Entity Framework 4,Entity Framework 5,我想创建一个具有多个属性的复合类,这些属性表示多个实体。它就像一个事务类。然后从控制器中的ViewModel更新该类的实例化。然后我想在这个类上调用一个“Save”方法来保存对entity类型属性的任何更改。我已经试过了,它确实有效,但现在不起作用了。我相信我已经失去了“上下文”,因为如果我直接在控制器中执行,它确实会工作(下面的选项3) 这是我们班的一些代码。这有点做作。这是我感兴趣的原则,即使用文档/事务类来保存多个实体数据: public class OrderTransaction

我想创建一个具有多个属性的复合类,这些属性表示多个实体。它就像一个事务类。然后从控制器中的ViewModel更新该类的实例化。然后我想在这个类上调用一个“Save”方法来保存对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;
        }
    }



}
选项1:直接从虚拟机上保存。我原以为我能让它工作,但现在不行

     vmodel.MyOrderTransaction.Save(); 
选项2:使用对象映射和保存指定给复合对象

     OrderTransaction myOrderTransaction = new OrderTransaction();
     myOrderTransaction.injectFrom<IgnorNulls>myVM.MyOrderTransaction 
选项3确实有效,但我并没有将我的复合类用于这种方法

那么,如何让我的复合类方法保存所有单例和列表属性呢

非常感谢

编辑

刚刚发现,如果我为在记录中检索的“OrderTransaction”添加一个构造函数,那么Option1将直接在VM/模型绑定中工作

        public OrderTransaction()
    {

        myOrder = db.Orders.Where(o => o.OrderId == 44).First();

    }
然而,我确实需要将一个参数传递到constructor ie ID中,但如果需要,我不确定如何执行此操作

编辑2:

实际上,选项2最好,因为我始终可以确保窗体不会将ViewModel可能表示的某些实体的值重置为null,因为它们不在该窗体上。因此,我们将检索数据集,映射表单实体,忽略任何空值,然后保存这个新对象

        OrderTransaction myOrderTransaction = new OrderTransaction(OrderID);
        myOrder.InjectFrom<IgnoreNulls>(MyVM.myFormOrder);
        myOrder.Save();
OrderTransaction myOrderTransaction=新的OrderTransaction(OrderID);
myOrder.InjectFrom(MyVM.myFormOrder);
myOrder.Save();

不幸的是,由于上下文已从ViewModel更改,上述内容不起作用,这是一个遗憾

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

public OrderTransaction(vmodel myVM)
{

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

}

谢谢你。好主意。我发现的最甜蜜的方法是通过模型绑定器ie Option1,但我正在努力解决如何在不编写自定义模型绑定器的情况下获取ID。只有调用SaveChanges()方法,才能获取ID。我假设你在这里使用EF。如果您的表关系正确,并且EF设置正确,则在db.Order元素中添加新元素,然后调用SaveChanges()将为您提供一个填充了id字段的新行。您好,很抱歉,我没有说清楚。当我说ID时,我指的是我传入的用于检索Order对象的ID,所以是OrderId,而不是插入后返回的ID。是的,我正在使用EF
        OrderTransaction myOrderTransaction = new OrderTransaction(OrderID);
        myOrder.InjectFrom<IgnoreNulls>(MyVM.myFormOrder);
        myOrder.Save();
public OrderTransaction(vmodel myVM)
{

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

}