[英]Entity framework - Check if entry exists before insertion and auto-increment
我目前在EF中保存数据的过程中遇到一个小问题。 我正在尝试使用自动递增的字段在单个事务中插入或更新多行。
这是我的代码:
var Orders = ctx.Orders;
foreach (var order in ordersForm)
{
var OrderEntity = Orders.Find(order.orderId);
if (OrderEntity == null)
{
OrderEntity = new Order();
}
OrderEntity.Name = order.name;
OrderEntity.Date = DateTime.Now;
...
// If no order in the set --> add order
if (!Orders.Local.Any(e => e == OrderEntity))
{
Orders.Add(OrderEntity);
}
if (ctx.Entry(Order).State == EntityState.Added
|| ctx.Entry(Order).State == EntityState.Modified)
{
OrderEntity.DateModified = DateTime.Now;
OrderEntity.LastUpdatedBy = Session["user"].ToString();
}
...
}
ctx.SaveChanges();
所以我试图从数据库或缓存中获取一个实体:
请注意,由于我没有调用SaveChanges方法,所以我新添加的实体将具有一个空ID。
当我第二次迭代并且必须创建另一个对象时,就会出现问题:
这是我的选择:
这就是这种情况……我想知道是否存在针对此特定情况的任何方法或“模式”,或者我是否应该针对上述“解决方案”之一?
编辑令我非常不幸的是,该系统的制作方式非常有问题...(不是我的,嘿嘿)T_T
为简单起见,每次更改时都会更新两个字段:updated_by和last_updated。 这意味着无论何时要保存数据,updated_by字段都与数据库中的值不同。 因此,每次保存数据时,由于此字段已更新,因此所有对象都被视为已修改。
这就是为什么我需要遍历循环以仅更新我需要的字段(这意味着除提到的2个字段之外的所有字段)的原因。
出于好奇,为什么在哪里没有选择呢? 我个人将通过将更新项和添加项分成两个列表来做到这一点,使用添加范围可以同时添加所有新项。
var newitems = ordersform.Where(i=> Orders.All(ii=>ii != i);
var updateItems = ordersform.Where(i=> Orders.Any(ii=> ii==i);
updateItems.Foreach(i => {Update Item};
Orders.AddRange(newItems);
ctx.SaveChanges();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.