c# - SaveChanges 更新一对多关系失败
问题描述
我有两个实体。第一个是“订单”
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();
但这不是一种有效的方法!——</p>
解决方案
每当您加载Order
如下内容时:
var order = _context.Orders.Find(new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"));
它没有与它一起加载Items
,Order
因此它没有被跟踪和更新!
所以你必须加载Items
如下Order
,然后修改Item
集合:
var order = _context.Orders.Where(o => o.Id == new Guid("67972aa1-2bb4-4916-b48b-1fdc3c2f5db9"))
.Include(o => o.Items).FirstOrDefault(); // I assumed your `Order` primary key name is `Id`
order.Items = new List<Item>
{
new Item { Color = "Green", width = 20d }
};
_context.SaveChanges();
推荐阅读
- azure - 无法使用 ARM 模板创建 Azure RBAC 自定义角色
- reactjs - 使用钩子和 redux 材料 ui 将值设置为文本字段
- excel - Vba宏来验证一个表是否包含另一个表的数据并复制行
- android - Android EditText 中的某些设备上未显示复制/粘贴菜单项
- ubuntu - 如何在 Ubuntu 上安装 hadolint
- html - jQuery DatePicker - 将语言更改为西班牙语
- sh - /bin/dash:匹配通配符时的奇怪行为 *
- arrays - 打印与数组元素不匹配的行
- python - Keras Sequential 模型拟合形状
- python - 查找列表中每个值的中位数