【发布时间】:2019-07-22 05:42:33
【问题描述】:
我看到一本书有这样的代码:
public class Order
{
public int OrderID { get; set; }
public ICollection<CartLine> Lines { get; set; }
...
}
public class CartLine
{
public int CartLineID { get; set; }
public Product Product { get; set; }
public int Quantity { get; set; }
}
//Product class is just a normal class that has properties such as ProductID, Name etc
在订单库中,有一个 SaveOrder 方法:
public void SaveOrder(Order order)
{
context.AttachRange(order.Lines.Select(l => l.Product));
if (order.OrderID == 0)
{
context.Orders.Add(order);
}
context.SaveChanges();
}
书上说:
在数据库中存储 Order 对象时。当用户的购物车数据从会话存储中反序列化时,JSON 包会创建未知的新对象 Entity Framework Core,然后尝试将所有对象写入数据库。对于 Product 对象,这意味着 Entity Framework Core 尝试写入已经存储的对象,这会导致错误。为了避免这个问题,我通知 Entity Framework Core 对象存在并且不应该存储在数据库中,除非它们被修改
我很困惑,有两个问题:
Q1-为什么写已经存储的对象会报错,从底层数据库的角度来看,只是一条更新SQL语句,将所有列修改为当前值?我知道通过更改会做不必要的工作什么都没有并重写所有内容,但它不应该在数据库级别引发任何错误?
Q2-为什么我们不对CartLine 做同样的事情:
context.AttachRange(order.Lines.Select(l => l.Product));
context.AttachRange(order.Lines);
防止CartLine对象像我们对Product对象那样存储在数据库中?
【问题讨论】:
标签: c# entity-framework-6 asp.net-core-mvc entity-framework-core