データベースに保存する前にエンティティの更新に関する問題を解決して、奇妙な動作をしました。Entity Frameworkの奇妙なエンティティをコードファーストで更新する
私はASP.NET MVC 3 WebアプリケーションでEntity Framework 4.1 Code-Firstを使用しています。ここにモデルです:
public class Order
{
public int OrderId { get; set; }
public int CarId { get; set; }
public DateTime BeginRentDate { get; set; }
public DateTime EndRentDate { get; set; }
public decimal RentPrice { get; set; }
public virtual Car Car { get; set; }
}
public class Car
{
public int CarId { get; set; }
public string Brand { get; set; }
public string Model { get; set; }
public string NumberPlate { get; set; }
public decimal RentPrice { get; set; }
}
各車にはRentPriceがあります。この価格は、作成時にOrderのRentPriceにコピーする必要があります。車は、私は価格の値をコピーしたいOrder.RentPriceはここで0
あるので、最初は、ユーザによって選択された:それは実体が検証エラーを持っているSaveChanges
にエラーのために働いていない
[HttpPost]
public ActionResult Create(Order order)
{
order.RentPrice = _context.Cars.Find(order.CarId).RentPrice;
if (ModelState.IsValid)
{
_context.Orders.Add(order);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(order);
}
。 OK。最初にUpdateModel(order);
に電話して値を変更する必要があることがわかりました。
だから私は何を持っています。ワーキングコード:
_context.Orders.Add(order);
UpdateModel(order);
order.RentPrice = 777;
_context.SaveChanges();
ない作業コード:
_context.Orders.Add(order);
UpdateModel(order);
order.RentPrice = _context.Cars.Find(order.CarId).RentPrice;
_context.SaveChanges();
動作するコードは(!):
_context.Orders.Add(order);
UpdateModel(order);
var t = (double)_context.Cars.Find(order.CarId).RentPrice;
order.RentPrice = (decimal)t;
_context.SaveChanges();
は、誰かが説明でき、ここで何が起こっているしてください?特にのマジックは、最後のコードブロックの3行目と4行目にあります。
更新
私はDbEntityValidationException
を取得しています:「検証は、1つのまたは複数のエンティティのために失敗した詳細は、 『EntityValidationErrors』プロパティを参照してください。」 内部例外から: "OriginalValuesは、追加状態のエンティティには使用できません。"
order.RentPrice = _context.Cars.Find(order.CarId).RentPrice;の最後に2つのセミコロンがあることに気付きましたか? - >コードの最後のブロックの隣で? – Jack
SaveChangesメソッドの検証エラーは何ですか?あなたの最初のCreateメソッドのコードはうまく動作します。 – agradl
@Jack、ポストを書いている間にちょうどタイプミス。一定。 –