加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:20:57 所属栏目:百科 来源:网络整理
导读:我在保存到数据库之前更新实体并解决了这个问题. 我在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 {
我在保存到数据库之前更新实体并解决了这个问题.

我在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 );
     }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读