c# – 实体框架代码优先中的奇怪实体更新

c# – 实体框架代码优先中的奇怪实体更新,第1张

概述我在保存到数据库之前更新实体并解决了这个问题. 我在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 我在保存到数据库之前更新实体并解决了这个问题.

我在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.

在这里我要复制价格值:

[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);}

由于SaveChanges上的错误导致实体出现验证错误,因此无法正常工作.好.我发现需要先调用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:“一个或多个实体的验证失败.有关详细信息,请参阅’EntityValIDationErrors’属性.”
从内部异常:“OriginalValues不能用于处于已添加状态的实体.”

解决方法 当你拿到时

“ValIDation Failed for one or more entitIEs. See
‘EntityValIDationErrors’ property for more details.” From the inner
exception: “OriginalValues cannot be used for entitIEs in the Added
state.”

这意味着存在诸如空白或其他约束的NOT NulL collumns之类的错误,通过调试等检查实体验证错误

try{...catch ( DbEntityValIDationException ex )   {foreach ( var valIDationErrors in ex.EntityValIDationErrors )    {     foreach ( var valIDationError in valIDationErrors.ValIDationErrors )     {      System.Diagnostics.Trace.Traceinformation( "Property: {0} Error: {1}",valIDationError.Propertyname,valIDationError.ErrorMessage );     }    }}
总结

以上是内存溢出为你收集整理的c# – 实体框架代码优先中的奇怪实体更新全部内容,希望文章能够帮你解决c# – 实体框架代码优先中的奇怪实体更新所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1240972.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存