Entity framework 实体框架关系修复失败

Entity framework 实体框架关系修复失败,entity-framework,Entity Framework,对于下面的代码,EF的预期行为是提交订单和带有orderID=100的orderItem,据我所知,该字段orderID的自动分配称为Relatiship fix-up。因此,我们不必为要添加的orderItem提供orderID字段 Entities ctx = new Entities(); Order order = new Order() { ID = 100, name = "abc"

对于下面的代码,EF的预期行为是提交订单和带有
orderID=100
orderItem
,据我所知,该字段
orderID
的自动分配称为Relatiship fix-up。因此,我们不必为要添加的
orderItem
提供
orderID
字段

        Entities ctx = new Entities();

        Order order = new Order()
        {
            ID = 100,
            name = "abc"
        };

        // ID field of OrderItem is auto-increment and the primary field
        //OrderItem is a navigation property of Order through the orderID field
        OrderItem orderItem = new OrderItem ()
        {
            name = "oi_abc"
        };
        order.OrderItems.Add(orderItem);

        ctx.Orders.Add(order);
        ctx.SaveChanges();
这段示例代码按预期工作。但问题是,我们项目中的一段类似代码未能正确修复关系。(我知道如果我能提供完整的代码就最好了,但由于代码和数据库的其他复杂性以及我们公司的政策,这是不可能的。)

        Entities ctx = new Entities();

        Order order = new Order()
        {
            ID = 100,
            name = "abc"
        };

        // ID field of OrderItem is auto-increment and the primary field
        //OrderItem is a navigation property of Order through the orderID field
        OrderItem orderItem = new OrderItem ()
        {
            name = "oi_abc"
        };
        order.OrderItems.Add(orderItem);

        ctx.Orders.Add(order);
        ctx.SaveChanges();
我们项目中的代码只是在提交期间将
orderID
设置为0

        Entities ctx = new Entities();

        Order order = new Order()
        {
            ID = 100,
            name = "abc"
        };

        // ID field of OrderItem is auto-increment and the primary field
        //OrderItem is a navigation property of Order through the orderID field
        OrderItem orderItem = new OrderItem ()
        {
            name = "oi_abc"
        };
        order.OrderItems.Add(orderItem);

        ctx.Orders.Add(order);
        ctx.SaveChanges();
需要注意的一些重要事项:

        Entities ctx = new Entities();

        Order order = new Order()
        {
            ID = 100,
            name = "abc"
        };

        // ID field of OrderItem is auto-increment and the primary field
        //OrderItem is a navigation property of Order through the orderID field
        OrderItem orderItem = new OrderItem ()
        {
            name = "oi_abc"
        };
        order.OrderItems.Add(orderItem);

        ctx.Orders.Add(order);
        ctx.SaveChanges();
  • 我们不会在任何地方禁用跟踪上下文的更改
  • 手动设置orderID可以工作,但我们不希望这样
  • 如果我们有
    ctx.Orders.Add(订单)order
    对象之后,代码>行将按预期工作

  • 在上述情况下,您是否可以猜测为什么会发生这种故障?

    如果您无法显示实际的故障代码,您是否可以共享该问题的最低复制版本?你有例外吗?您的语句
    我们项目中的代码只是在提交期间将orderID设置为0正在说明问题。我相信EF生成的代理可以区分未初始化的0值和已显式设置的0值之间的差异。如果它看到您设置了Id,它将假定您已将其设置为一个您知道是好的值,因此将使用该值保存它,而不是运行fixup。我目前无法测试这个理论,所以这只是一个猜测。关系修正只适用于上下文中同时存在的条目。我希望您的订单对象在处理上下文中既没有加载也没有附加。如果是这种情况,我建议附加订单对象(未更改即可)
    
            Entities ctx = new Entities();
    
            Order order = new Order()
            {
                ID = 100,
                name = "abc"
            };
    
            // ID field of OrderItem is auto-increment and the primary field
            //OrderItem is a navigation property of Order through the orderID field
            OrderItem orderItem = new OrderItem ()
            {
                name = "oi_abc"
            };
            order.OrderItems.Add(orderItem);
    
            ctx.Orders.Add(order);
            ctx.SaveChanges();