LINQ to SQL 不强制实施以下要求,但如果不满足这些要求,则行为是未定义的。
重写方法不能调用SubmitChanges 或 Attach。 如果在重写方法中调用了这些方法,LINQ to SQL 将引发异常。
重写方法不能用来启动、提交或停止事务。 SubmitChanges 操作以事务的形式执行。 内部嵌套事务可能会干扰外部事务。 加载重写方法只能在它们确定 Transaction 中未在执行相应操作后启动事务。
重写方法应遵循适用的开放式并发映射。 发生开放式并发冲突时,重写方法应引发 ChangeConflictException。 LINQ to SQL 捕获此异常,以便您可以正确处理 SubmitChanges 上提供的 SubmitChanges 选项。
创建(
Insert
)和Update
重写方法应在操作成功完成时将数据库生成的列的值返回到相应的对象成员。例如,如果
Order.OrderID
映射到标识列(自动创建 主键),则InsertOrder()
重写方法必须检索数据库生成的 ID 并将成员设置为Order.OrderID
该 ID。 同样,时间戳成员必须更新到数据库生成的时间戳值,以确保更新的对象是一致的。 未能传播数据库生成的值可能会导致数据库与由 DataContext数据库跟踪的对象之间不一致。用户负责调用正确的动态 API。 例如,在更新重写方法中,只能调用 ExecuteDynamicUpdate。 LINQ to SQL 不会检测或验证调用的动态方法是否与适用的作匹配。 如果调用了不可应用的方法(例如, ExecuteDynamicDelete 要更新对象),则结果未定义。
最后,重写方法应执行明确的操作。 LINQ to SQL 操作(如紧急加载、延迟加载和 SubmitChanges)的语义要求重写提供明确的服务。 例如,仅返回空集合而不检查数据库中的内容的负载重写可能会导致数据不一致。