这可能已经被问过了,但是我找不到了,所以这里就去了。
我们使用Context.GetTable()对表进行泛型读取,然后附加表达式以查找表中的单个记录。该表有关联。不幸的是,我们正试图改变一个关联的字段,所以;
Foo是FooId上Bar的父母
当我们要更改FooId时,它会崩溃,因为EntityRef的HasAlreadyLoaded属性设置为true。除非我不能很好地理解LinqToSql,否则我认为这是在这个记录集上调用SingleOrDefault的行为,它实际上触发了查询,从而加载了所有相关的对象。
有没有办法阻止这种加载? (ObjectTrackingEnabled和DeferredLoading设置为true)如果不是这个问题的常见解决方案是什么?我们目前还不了解个人关系,我不想看看是否有可能找出关联并根据id加载它们。
我首选的方法是不太通用的方法,我可以做.Foo = Context.Foo.Select(x => x.Id == FooId),但我们现在没有那么奢侈。
答案 0 :(得分:1)
在LINQ to SQL中,要更新关联属性,必须将子对象从一个父对象EntitySet<>
移动到另一个父对象EntitySet<>
,并且在移动期间LINQ to SQL会自动更新子对象的关联属性
例如:
// Get the source parent
Foo foo1 = context.Foos.Where(f => f.ID == 1).SingleOrDefault();
Bar bar1 = foo1.Bars[0];
// (Note: you don't necessarily need to get foo1 first -
// you could just get bar1 directly and proceed from here...)
// Get the destination parent
Foo foo2 = context.Foos.Where(f => f.ID == 2).SingleOrDefault();
// Move the child over. LINQ to SQL automatically updates bar1.FooID from 1 to 2 here.
foo2.Bars.Add(bar1);
// Done.
context.SubmitChanges();