複数のエンティティを表す複数のプロパティを持つ複合クラスを作成したいと考えています。トランザクションクラスのようなものです。次に、コントローラの 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 : 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/モデル バインディングから直接離れます。
public OrderTransaction()
{
myOrder = db.Orders.Where(o => o.OrderId == 44).First();
}
ただし、パラメーター、つまりIDをコンストラクターに渡す必要がありますが、必要に応じてこれを行う方法がわかりません。
EDIT2:
実際には Option2 が最適です。なぜなら、ViewModel がそのフォーム上にないため、一部のエンティティに対してフォームが値を null にリセットしていないことを常に確認できるからです。したがって、データ セットを取得し、null を無視してフォーム エンティティをマップし、この新しいオブジェクトを保存します。
OrderTransaction myOrderTransaction = new OrderTransaction(OrderID);
myOrder.InjectFrom<IgnoreNulls>(MyVM.myFormOrder);
myOrder.Save();
残念ながら、コンテキストがViewModelから変更されたため、上記は機能しません。これは残念です。