我们有一个Repository
课程。虽然这个类有一些自定义行为,但它包装了一个标准的ObjectContext
对象,所以它主要是标准的实体框架。
目前,我们有以下代码块,它可以工作但执行可怕。 (target
是CostingLineItem
。代码会更改此AddedByEmployee
的{{1}}引用。)
CostingLineItem
因为我们启用了延迟加载,所以这段代码会加载if (target.AddedByEmployee != null)
target.AddedByEmployee.CostingLineItems.Remove(target);
byEmployee.CostingLineItems.Add(target);
target.AddedByEmployee = byEmployee;
和target.AddedByEmployee.CostingLineItems
个集合,这些集合可能有数千行。
不幸的是,我无法更改此代码的延迟加载设置。我需要找到一种方法来提高效率,但似乎没有什么对我有用。
这是我迄今为止所尝试的内容。
方法1:
byEmployee.CostingLineItems
无效。 target.AddedByEmployeeId = byEmployee.Id;
列仍包含原始值。显然,原始员工参考仍然存在并优先考虑。
方法2:
AddedByEmployeeId
引发以下异常。再次,似乎原始的员工参考仍在那里。
违反了多重性约束。角色'员工'关系' Leo.Domain.FK_CostingLineItem_Employees'具有多重性1或0..1。
方法3:
target.AddedByEmployee = byEmployee;
Repository.Detach(target.AddedByEmployee);
target.AddedByEmployee = byEmployee;
(反过来调用Detach()
)会抛出以下异常:
无法分离对象,因为它未附加到ObjectStateManager。
方法4:
ObjectContext.Detach()
这个有效!但它仍在加载target.AddedByEmployee.CostingLineItems.Remove(target);
target.AddedByEmployee = byEmployee;
,我想避免这种情况。
我意识到我没有在这里显示所有代码(这是不可能的)。但是代码使用的是下面的标准target.AddedByEmployee.CostingLineItems
。我真正想要的是对实体框架有一些见解的人,可以为我可以尝试的其他内容或者我还能检查的内容提供一些想法。
注意:我们目前正在运行Visual Studio 2012.我将看看我们是否可以更新到2015年。我很想知道自从我们使用的版本以来是否有任何更改可能使上面的一些方法工作他们之前没有去过的地方。
答案 0 :(得分:0)
您是否尝试直接从DbSet<>
删除目标,而不是将其从附加的CostingLineItems
中删除。
context.Set<CostingLineItems>().Remove(target)
这应该在不加载集合的情况下删除目标。
答案 1 :(得分:0)
经过一番广泛的研究和测试,我认为我确定了我的问题。
问题是有问题的实体刚被克隆到数据库中。克隆代码遵循一系列规则,规定是否还克隆相关项目或仅克隆引用。
无论哪种方式,AddedByEmployee
已经设定好了。因此,尝试设置它第二次,或者只是尝试设置ID会因为与已设置的内容发生冲突而出现问题。