.net linq到sql在内存中创建实体后插入实体

.net linq到sql在内存中创建实体后插入实体,.net,linq-to-sql,.net,Linq To Sql,我正在为一家租车公司建立一个预订引擎 我有一个Booking l2s对象,它有一个Car和Location对象(以及随后的FK CarID/LocationID字段) 在预订过程的第一步,我创建了一个新的booking()类。这将在会话中传递给后续页面 当用户继续执行该过程时,会设置CarID和LocationID属性,但是由于Booking对象尚未持久化回数据库,因此我无法引用Booking.Car.CarModel 所以我要做的是明确地设置它: Booking.Car = DB.Car.Wh

我正在为一家租车公司建立一个预订引擎

我有一个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.Car=null)设为null,则会抛出另一个错误:

试图消除汽车和预订之间的关系。但是,关系的一个外键(Booking.CarID)不能设置为null

现在我被难倒了


最终解决方案
我最后做的(在尝试了一系列不同的事情之后)是在保存预订之前,我从当前上下文重新加载汽车和位置对象。效率不高,但我相信您的数据文本处理有问题。您是否为每个请求创建一个?如果答案是肯定的,那么问题在于对象与不同的上下文相关联。您必须将它们从用于从数据库获取它们的上下文中分离出来,并将它们重新匹配到要用于存储它们的上下文中。

只是一个旁注-您可以将谓词从Where()移动到Single(),从而生成Booking.Car=DB.Car.Single(x=>x.id==Booking.CarID);好的,可能是在这里。汽车和位置对象是从不同的上下文加载的。