我有两个实体。首先是“订单”
public class Order : EntityBase
{
public Guid ClientKey { get; set; }
public Guid EmployeeKey { get; set; }
public DateTime CreatedOn { get; set; }
public DeliveryType DeliveryType { get; set; }
public Address Address { get; set; }
public Client Client { get; set; }
public Employee Employee { get; set; }
public bool SoftDeleted { get; set; }
public virtual ICollection<JourneyOrder> JourneyOrder { get; set; }
**public virtual ICollection<Item> Items
{ get; set; }**
public virtual ICollection<ItemToBeFactored> ItemToBeFactored
{ get; set; }
public Order() : base()
{
Items = new HashSet<Item>();
ItemToBeFactored = new HashSet<ItemToBeFactored>();
JourneyOrder = new HashSet<JourneyOrder>();
CreatedOn = DateTime.Now;
}
}
第二个是:“项目”:
public class Item : EntityBase
{
public string Name { get; set; }
public double Height { get; set; }
public double width { get; set; }
public string Color { get; set; }
public Guid OrderKey { get; set; }
**public Order CustomerOrder { get; set; }**
}
我正在尝试通过以下代码更新Order实体中的导航属性:
var order = _context.Orders.Where(x => x.Key.Equals(new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"))).Include(x => x.Items).
First();
order.Items = new List<Item>
{
new Item { Color = "Green", width = 20d }
};
_context.SaveChanges();
我得到这个重复的错误:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:'数据库操作预期会影响1行,但实际上影响0行。自加载实体以来,数据可能已被修改或删除
此更新正在“一对一”属性上工作,但在多个导航属性上却有问题!!
更新:
我可以用虚拟的方式使用更新! 第一:我清除了订单中的物品, 然后
_context.Items.add( new Item { OrderKey = order.Key, Color = "Blue", width = 240d })
then _context.SaveChanges();
但这不是一种有效的方法! –
答案 0 :(得分:0)
每当您按以下方式加载Order
时:
var order = _context.Orders.Find(new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"));
它不会与Items
的{{1}}一起加载,因此不会被跟踪和更新!
因此,您必须按照以下方式加载Order
和Items
,然后修改Order
集合:
Item
答案 1 :(得分:0)
你需要做的是调用Context.Update(将你的对象作为参数传递在这里),见下文
var order = _context.Orders.Where(x => x.Key.Equals(new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"))).Include(x => x.Items).
First();
order.Items = new List<Item>
{
new Item { Color = "Green", width = 20d }
};
_context.Update(order);
_context.SaveChanges();
这在您创建的 DbContext 的同一个实例中非常完美。让它在我身边完美地工作