LINQ to SQL: Обработка загрузки отложенных загруженных ассоциаций - PullRequest
7 голосов
/ 30 апреля 2010

Если у меня есть объект, который лениво загружает ассоциацию с очень большими объектами, могу ли я выполнить обработку в тот момент, когда происходит ленивая загрузка? Я думал, что мог бы использовать AssociateWith или LoadWith из DataLoadOptions, но есть очень и очень конкретные ограничения на то, что вы можете сделать в них. По сути, мне нужно получать уведомление, когда EntitySet <> решает, что пришло время загрузить связанный объект, чтобы я мог перехватить это событие и выполнить некоторую обработку загруженного объекта. Я не хочу просто проходить через EntitySet, когда я загружаю родительский объект, потому что это заставит загружать все лениво загруженные элементы (полностью отказавшись от ленивой загрузки).

Ответы [ 4 ]

2 голосов
/ 25 мая 2010

Подписаться на событие ListChanged

EntitySet предоставляет событие ListChanged, которое можно использовать для определения, добавляется ли элемент. Оцените свойство ListChangedType объекта ListChangedEventArgs. Вот ссылка на значения, доступные в перечислении ListChangedType.

Нет опасности заставить загрузку выполняться, пока вы не запросите перечислитель.

http://msdn.microsoft.com/en-us/library/system.componentmodel.listchangedtype.aspx

1 голос
/ 24 мая 2010

Существует множество встроенных методов расширяемости для текста данных и классов данных, генерируемых Linq2SQL.

http://msdn.microsoft.com/en-us/library/bb882671.aspx

http://csainty.blogspot.com/2008/01/linq-to-sql-extending-data-classes.html

Любой из них может служить цели, которая вам нужна.

1 голос
/ 30 апреля 2010

Я не вижу точек расширения для этого доступных;Единственное, что я вижу, это то, что в сущности FK есть метод Created для каждого отдельного объекта, который запускается из конструктора ...

Так что конструктор вызывает созданный, и лично я не на 100%убедитесь, что загрузка набора сущностей создает каждый отдельный объект в это время и запускает событие ...

HTH.

0 голосов
/ 25 мая 2010

Вы определенно не обязаны использовать значение по умолчанию EntitySet<>, но вместо этого можете использовать любую коллекцию IList <>. Я немного поразмышлял над EntitySet <>, но не нашел хука в методе Load (), который реализует перечисление ленивого источника набора сущностей (именно там EntitySet фактически запрашивается и материализуется).

Linq To SQL будет использовать метод Assign () для назначения источника IEnumerable (который по умолчанию ленив) для вашей коллекции. Начиная с этого момента, вы можете реализовать свою собственную ленивую загрузку EntitySet с пользовательским хуком в точке, где вы сначала перечислите исходную коллекцию (выполните запрос).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...