Asp.net mvc 3 是否可以使用实体的复合类,更新这些属性,然后将复合对象保存到数据库?
我想创建一个具有多个属性的复合类,这些属性表示多个实体。它就像一个事务类。然后从控制器中的ViewModel更新该类的实例化。然后我想在这个类上调用一个“Save”方法来保存对entity类型属性的任何更改。我已经试过了,它确实有效,但现在不起作用了。我相信我已经失去了“上下文”,因为如果我直接在控制器中执行,它确实会工作(下面的选项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
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
}