实体框架6无法更新DB中的列

时间:2017-03-17 20:12:47

标签: c# entity-framework

我正在尝试将子实体(首先是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工作正常。任何帮助将不胜感激!

2 个答案:

答案 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;
}