【问题标题】:linq to sql inserting an entity after creating in memorylinq to sql 在内存中创建后插入实体
【发布时间】:2009-05-21 10:03:50
【问题描述】:

我正在为汽车租赁场所构建预订引擎。

我有一个 Booking l2s 对象,它有一个 Car 和 Location 对象(以及后续的 FK CarID / LocationID 字段)。

在预订过程的第一步,我新建了一个 Booking() 类。这在会话中传递到后续页面。

随着用户继续执行该过程,CarID 和 LocationID 属性已设置,但由于 Booking 对象尚未持久化回数据库,因此我无法引用 Booking.Car.CarModel。

所以我正在做的是明确设置它:

Booking.Car = DB.Car.Where(x => x.id == Booking.CarID).Single();

等等

当需要保存预订时,它会抛出:

已尝试附加或 添加一个不是新的实体,也许 从另一个加载 数据上下文。这不受支持。

因此,它似乎认为 Booking 实体并不新。如果我尝试清除我明确设置的值(Booking.Car = null),它会引发另一个错误:

已尝试删除 Car 和 Booking 之间的关系。但是,关系的其中一个外键 (Booking.CarID) 不能设置为 null。

现在我被难住了......


最终解决方案

我最终做的(在尝试了一堆不同的事情之后)是在保存预订之前,我从当前上下文中重新加载 Car 和 Location 对象。效率不高,但嗯。

【问题讨论】:

  • 附注 - 您可以将谓词从 Where() 移动到 Single() 产生 Booking.Car = DB.Car.Single(x => x.id == Booking.CarID);

标签: .net linq-to-sql


【解决方案1】:

我很确定您的数据上下文处理存在问题。您是否为每个请求创建一个?如果答案是肯定的,那么问题在于您的对象与不同的上下文相关联。您必须将它们从用于从数据库中获取它们的上下文中分离出来,然后将它们重新附加到您要用于存储它们的上下文中。

【讨论】:

  • 好的,可以在这里做点什么。 Car 和 Location 对象是从不同的上下文加载的。
猜你喜欢
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多