2010-03-28 43 views
2

我试图插入几个新创建的项目到数据库。 我有一个名为“Order”的LINQ2SQL生成的类。LINQ to SQL - 插入产生奇怪的行为

内部订单中有一个名为“OrderItems”的属性,它也由LINQ2SQL生成并表示该订单的项目。

到目前为止这么好。 我现在遇到的问题是,当我尝试在Order内添加多个新创建的OrderItem时。

即:

Order o = orderWorker.GetById(10); 
for(int i=0; i < 5; ++i) { 
    OrderItem oi =new OrderItem { 
       Order = o, 
       Price = 100, 
       ShippingPrice = 100, 
       ShippingMethod = ..., 
       Item = someItem 
      }; 
    o.OrderItems.Add(oi); 
} 

context.SubmitChanges(); 

不幸的是,被添加仅单个实体。 是的,我通过添加Context.Log = Console.Out来检查生成的SQL,是的,只创建了一条语句。

任何线索? 当我知道我没有使用InsertOnSubmit,通过文件的方式说:

您可以明确要求通过 插入使用InsertOnSubmit。或者, LINQ to SQL可以通过 推断插入连接到 之一的已知对象,该对象必须是 已更新。例如,如果你一个 未跟踪对象到 EntitySet的(TEntity)已或设置 的EntityRef(TEntity)已添加到未跟踪 对象,则使未跟踪对象 到达由在 图表跟踪对象的方法。在处理 SubmitChanges时,LINQ to SQL遍历 跟踪的对象并发现任何 未被跟踪的可访问持久对象 。这些对象是 候选人,用于插入 数据库。

非常感谢您的时间。

回答

2

问题解决了,有点。

问题是我天真地实现了GetHashcode方法。 意思是,它为已经创建的实体返回适当的哈希码,但是对于新创建的实体(没有分配的ID)它返回相同的哈希码。

所以我禁用了我的实现等于& GetHashcode,它工作得很好。 谢谢你尝试=)

+0

谢谢你喂回来 - 有趣。 – 2010-03-29 21:47:02

+0

这没什么意义......为什么我不能插入2个具有相同散列值并且比较等于的新对象? – 2016-06-06 16:09:32

0

这听起来很疯狂,但我想知道如果您删除Order = o作业,并将其添加到OrderLines集合中,它是否会以不同的方式工作。试试看,至少。

+0

我试过你的建议,但它没有奏效。 它仍然只添加一个项目。 那么它有点让我惊讶这种行为。 我的意思是如果有什么事情是非常错误的,没有任何实体会被添加,但是添加单个实体会使我担心。我相信这与LINQ2SQL将所有我创建的新实体作为同一实体进行察觉的事实...很奇怪= \ – 2010-03-29 21:16:31