【问题标题】:Is it possible to use a composite class of entities, updates those properties and then save the composite object to the DB?是否可以使用实体的复合类,更新这些属性,然后将复合对象保存到数据库?
【发布时间】:2013-04-27 22:55:10
【问题描述】:

我想创建一个具有多个属性的复合类,这些属性代表多个实体。它就像一个事务类。然后,我从控制器中的 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,但如果需要,我不确定如何执行此操作。

EDIT2:

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

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

不幸的是,由于上下文已从 ViewModel 更改,因此上述方法不起作用,这是一种耻辱。

【问题讨论】:

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


    【解决方案1】:

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

    public OrderTransaction(vmodel myVM)
    {
    
        //then convert myVM to a order class here, add it to context then call db.SaveChanges
    
    }
    

    【讨论】:

    • 谢谢。有趣的想法。我发现最甜蜜的方法是通过模型绑定器,即 Option1,但我正在努力弄清楚如何在不编写自定义模型绑定器的情况下获得 ID。
    • 只有在调用 SaveChanges() 方法后才能获得 ID。我假设你在这里使用 EF。如果您的表关系正确,并且 EF 设置正确,则向 db.Order 元素添加一个新元素,然后调用 SaveChanges() 应该会为您提供一个填充了 id 字段的新行。
    • 嗨,对不起,我没有说清楚。当我说 ID 时,我的意思是我传入的用于检索 Order 对象的 ID,因此 OrderId,而不是在插入后返回的 ID。是的,我正在使用 EF
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2023-03-18
    • 2014-04-06
    相关资源
    最近更新 更多