LinqToSql关联加载

时间:2010-09-23 11:12:51

标签: c# linq-to-sql associations

这可能已经被问过了,但是我找不到了,所以这里就去了。

我们使用Context.GetTable()对表进行泛型读取,然后附加表达式以查找表中的单个记录。该表有关联。不幸的是,我们正试图改变一个关联的字段,所以;

Foo是FooId上Bar的父母

当我们要更改FooId时,它会崩溃,因为EntityRef的HasAlreadyLoaded属性设置为true。除非我不能很好地理解LinqToSql,否则我认为这是在这个记录集上调用SingleOrDefault的行为,它实际上触发了查询,从而加载了所有相关的对象。

有没有办法阻止这种加载? (ObjectTrackingEnabled和DeferredLoading设置为true)如果不是这个问题的常见解决方案是什么?我们目前还不了解个人关系,我不想看看是否有可能找出关联并根据id加载它们。

我首选的方法是不太通用的方法,我可以做.Foo = Context.Foo.Select(x => x.Id == FooId),但我们现在没有那么奢侈。

1 个答案:

答案 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();