Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 从分离状态更新具有相关实体的对象_Asp.net_Asp.net Mvc 3_Entity Framework 4 - Fatal编程技术网

Asp.net 从分离状态更新具有相关实体的对象

Asp.net 从分离状态更新具有相关实体的对象,asp.net,asp.net-mvc-3,entity-framework-4,Asp.net,Asp.net Mvc 3,Entity Framework 4,当我从实体框架进行查询时,我总是以分离状态进行查询,以便检索到的记录可以存储在缓存中以供后续请求使用 现在我有一个用户可以编辑的表单,其中包含一个父记录,然后是两个父记录列表 当数据发布到服务器时,我使用AutoMapper将视图模型映射到实体框架对象中。数据看起来不错;AutoMapper正在正确映射数据 当我附加对象以便更新它时,会引发异常:发生引用完整性约束冲突:定义引用约束的属性值在关系中的主体对象和从属对象之间不一致 public static void UpdateOrder(Shi

当我从实体框架进行查询时,我总是以分离状态进行查询,以便检索到的记录可以存储在缓存中以供后续请求使用

现在我有一个用户可以编辑的表单,其中包含一个父记录,然后是两个父记录列表

当数据发布到服务器时,我使用AutoMapper将视图模型映射到实体框架对象中。数据看起来不错;AutoMapper正在正确映射数据

当我附加对象以便更新它时,会引发异常:
发生引用完整性约束冲突:定义引用约束的属性值在关系中的主体对象和从属对象之间不一致

public static void UpdateOrder(ShippingOrder shippingOrder) {
    using (OrderEntity orderContext = new OrderEntity()) {
        //Exception happens here
        orderContext.ShippingOrders.Attach(shippingOrder);
        //Update the order itself; mark the order has being modified so the EF will update it.
        orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, System.Data.EntityState.Modified);
        //Perform the update.
        orderContext.SaveChanges();
    }
}
EntityFramework(EF)似乎认为我的密钥没有对齐,但我不确定什么是错误的。外键属性确实有正确的值,所以我不确定它正在检查什么。有人有什么想法吗?

而不是

orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, System.Data.EntityState.Modified);
试试这个

orderContext.Entry(ShippingOrder).State = EntityState.Modified;
而不是

orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, System.Data.EntityState.Modified);
试试这个

orderContext.Entry(ShippingOrder).State = EntityState.Modified;
如前所述

插入或更新模式某些应用程序的常见模式是 将实体添加为新实体(导致数据库插入)或附加 将实体标记为现有并将其标记为已修改(生成数据库 更新)取决于主键的值。例如,当 使用数据库生成的整数主键处理 零键为新的实体和非零键为新的实体 现有的。可以通过设置实体状态来实现此模式 基于对主键值的检查。例如:

你可以试试

public static void UpdateOrder(ShippingOrder shippingOrder) {
    using (OrderEntity orderContext = new OrderEntity()) {       
        orderContext.Entry(shippingOrder).State = shippingOrder.Id==0?
                                                  EntityState.Added :
                                                  EntityState.Modified;

        orderContext.SaveChanges();
    }
}
 public static void UpdateOrder(ShippingOrder shippingOrder) {
        using (OrderEntity orderContext = new OrderEntity()) {                  
            orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, EntityState.Modified);    
            orderContext.SaveChanges();
        }
    }

更新:

对于
ObjectContext
类,您可以尝试

public static void UpdateOrder(ShippingOrder shippingOrder) {
    using (OrderEntity orderContext = new OrderEntity()) {       
        orderContext.Entry(shippingOrder).State = shippingOrder.Id==0?
                                                  EntityState.Added :
                                                  EntityState.Modified;

        orderContext.SaveChanges();
    }
}
 public static void UpdateOrder(ShippingOrder shippingOrder) {
        using (OrderEntity orderContext = new OrderEntity()) {                  
            orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, EntityState.Modified);    
            orderContext.SaveChanges();
        }
    }
如前所述

插入或更新模式某些应用程序的常见模式是 将实体添加为新实体(导致数据库插入)或附加 将实体标记为现有并将其标记为已修改(生成数据库 更新)取决于主键的值。例如,当 使用数据库生成的整数主键处理 零键为新的实体和非零键为新的实体 现有的。可以通过设置实体状态来实现此模式 基于对主键值的检查。例如:

你可以试试

public static void UpdateOrder(ShippingOrder shippingOrder) {
    using (OrderEntity orderContext = new OrderEntity()) {       
        orderContext.Entry(shippingOrder).State = shippingOrder.Id==0?
                                                  EntityState.Added :
                                                  EntityState.Modified;

        orderContext.SaveChanges();
    }
}
 public static void UpdateOrder(ShippingOrder shippingOrder) {
        using (OrderEntity orderContext = new OrderEntity()) {                  
            orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, EntityState.Modified);    
            orderContext.SaveChanges();
        }
    }

更新:

对于
ObjectContext
类,您可以尝试

public static void UpdateOrder(ShippingOrder shippingOrder) {
    using (OrderEntity orderContext = new OrderEntity()) {       
        orderContext.Entry(shippingOrder).State = shippingOrder.Id==0?
                                                  EntityState.Added :
                                                  EntityState.Modified;

        orderContext.SaveChanges();
    }
}
 public static void UpdateOrder(ShippingOrder shippingOrder) {
        using (OrderEntity orderContext = new OrderEntity()) {                  
            orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, EntityState.Modified);    
            orderContext.SaveChanges();
        }
    }

您可以尝试以下方法:

ShippingOrder existingShippingOrder = orderContext.ShippingOrders.Find(shippingOrder.ID);
orderContext.Entry(existingShippingOrder ).CurrentValues.SetValues(shippingOrder);

您可以尝试以下方法:

ShippingOrder existingShippingOrder = orderContext.ShippingOrders.Find(shippingOrder.ID);
orderContext.Entry(existingShippingOrder ).CurrentValues.SetValues(shippingOrder);

我并不是真的在按那个密码。对Attach的调用导致异常。@Ek0nomik-调试时,ShippingOrder的主键是否为空?我很好奇您是否确保在视图的表单中使用
@Html.HiddenFor()
。实际上是我表中主键的属性有一个值。但是,EntityKey属性(属于实体框架基类)显示空值。@Ek0nomik-这个答案可能会帮助您:我已经看过这个问题了。我的所有属性都映射正确。作为外键的属性具有正确的值,作为主键的父对象上的属性具有正确的值。我觉得有一些基本属性设置不正确。我并没有真正使用这些代码。对Attach的调用导致异常。@Ek0nomik-调试时,ShippingOrder的主键是否为空?我很好奇您是否确保在视图的表单中使用
@Html.HiddenFor()
。实际上是我表中主键的属性有一个值。但是,EntityKey属性(属于实体框架基类)显示空值。@Ek0nomik-这个答案可能会帮助您:我已经看过这个问题了。我的所有属性都映射正确。作为外键的属性具有正确的值,作为主键的父对象上的属性具有正确的值。我觉得有些基本属性设置不正确。您使用的是什么版本的EF?我的上下文中没有可用的
Entry
方法。我引用的链接使用
DBContext
如果没有Entry方法,则必须使用
ObjectContext
类更新答案,这正是您试图做的,但将修改后的对象附加到上下文而不将其状态更改为“已修改”会引发引用完整性异常,因为对象状态未修改,它被视为插入,因此冲突会发生。您使用的EF版本是什么?我的上下文中没有可用的
Entry
方法。我引用的链接使用
DBContext
如果没有Entry方法,则必须使用
ObjectContext
类更新答案,这正是您试图做的,但将修改后的对象附加到上下文而不将其状态更改为“已修改”会引发引用完整性异常,因为对象状态未修改,所以会将其视为插入,从而发生冲突