我正在尝试将子实体(首先是SofiePurchaseOrder代码)附加到父实体(首先从现有数据库表中附加sofie_dfill代码)。我将实体标记为已修改但在保存更改并检查数据库后,它没有更改。
public class dfill //yay legacy
{
public int id { get; set; }
//other fields
public Guid? PurchaseOrderID { get; set; }
public virtual PurchaseOrder PurchaseOrder { get; set; }
}
public class PurchaseOrder
{
public Guid ID { get; set; }
//other fields
public virtual ICollection<sofie_dfill> DfillsOnThisOrder { get; set; }
}
我有一个静态类试图更新PurchaseOrderID
private static void MakeApiCallsForStore(int ShipToStoreID, List<dfill> dfills)
{
do
{
var ThisOrderID = Guid.NewGuid();
List<dfill> AllDfillsForThisOrder = db.//grab all dfills with the same order_no
var OrderLog = new PurchaseOrder();
OrderLog.ID = ThisOrderID;
OrderLog.BillToStoreID = LogisticsStoreID;
OrderLog.ShipToStoreID = ShipToStoreID;
OrderLog.EstimatedArrivalDate = DateTime.Now;
db.PurchaseOrderLogs.Add(OrderLog);
foreach (var dfill in AllDfillsForThisOrder)
{
dfill.PurchaseOrderID = ThisOrderID; //field looking to update
db.ProductsOrdered.Attach(dfill);
db.Entry(dfill).State = System.Data.Entity.EntityState.Modified;
}
} while ([condition]);
db.SaveChanges();
}
我尝试了多种解决方案,包括将单个字段标记为已修改。添加OrderLog工作正常。任何帮助将不胜感激!
答案 0 :(得分:1)
您是否尝试将dfills添加到Order PurchaseOrder的DfillsOnThisOrder集合中?你可以避免使用foreach
private static void MakeApiCallsForStore(int ShipToStoreID, List<dfill> dfills)
{
do
{
var ThisOrderID = Guid.NewGuid();
List<dfill> AllDfillsForThisOrder = db.//grab all dfills with the same order_no
var OrderLog = new PurchaseOrder();
OrderLog.ID = ThisOrderID;
OrderLog.BillToStoreID = LogisticsStoreID;
OrderLog.ShipToStoreID = ShipToStoreID;
OrderLog.EstimatedArrivalDate = DateTime.Now;
OrderLog.DfillsOnThisOrder = new List<dfill>();
OrderLog.DfillsOnThisOrder.AddRange(AllDfillsForThisOrder);
db.PurchaseOrderLogs.Add(OrderLog);
} while ([condition]);
db.SaveChanges();
}
不确定这是否会专门解决您的问题,但它明确地在实体框架的对象图中设置关系,因为dfills是相关集合的一部分。由于在设置dfills上的外键关系之前没有在上下文中保存采购订单,因此EF可能会使用您当前正在执行的方法绊倒自己。
答案 1 :(得分:1)
我没有看到从 PurchaseOrder 到 dfill 之间的关系,虽然有一个来自 dfill 至 PurchaseOrder 。
无论如何,您是否可以尝试将 OrderLog 分配给 dfill.PurchaseOrder ?
foreach (var dfill in AllDfillsForThisOrder)
{
dfill.PurchaseOrder = OrderLog;
}