LinqToSql ассоциации загрузки - PullRequest
2 голосов
/ 23 сентября 2010

Возможно, об этом уже спрашивали, но я не могу его найти, поэтому здесь.

У нас есть общее чтение таблицы с использованием Context.GetTable (), а затем присоединение выражения для поискаединственная запись в таблице.Эта таблица имеет ассоциации.К сожалению, мы пытаемся изменить поле, в котором создается ассоциация, поэтому:

Foo является родителем Bar для FooId

Когда мы собираемся изменить FooId, происходит сбойпотому что свойство HasAlreadyLoaded объекта EntityRef имеет значение true.Если я недостаточно хорошо понимаю LinqToSql, я считаю, что именно вызов SingleOrDefault для этого набора записей фактически запускает запрос и, таким образом, загружает все связанные объекты.

Есть ли способ остановить эту загрузку?(ObjectTrackingEnabled и DeferredLoading установлены в true), и если нет, каково общее решение этой проблемы?На данный момент мы не знаем об индивидуальных отношениях, и я не хочу смотреть на возможность выяснить ассоциации и загрузить их на основе идентификатора.

Мой предпочтительный метод был бы менее универсальным, и я мог бы сделать .Foo = Context.Foo.Select (x => x.Id == FooId), но у нас нет такой роскошиТеперь.

1 Ответ

1 голос
/ 04 октября 2010

В 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();
...