Материализация связанных объектов от SP с использованием EF Extensions - PullRequest
1 голос
/ 14 декабря 2009

У меня есть хранимая процедура, которая возвращает коллекцию объектов моего класса сущности. Так как я хочу, чтобы мои свойства навигации также были заполнены, я использую EF Extensions и написал свой собственный класс Materializer.

Но. Мой класс сущности имеет свойство навигации Type, которое указывает на другую сущность. Хранимая процедура, конечно, возвращает идентификатор из справочной таблицы (внешний ключ).

Я хотел бы заполнить свои типы, как если бы я с нетерпением загружал связанную сущность. Как мне это сделать в моем Материализаторе? Можно ли сделать это без хранимой процедуры, которая возвращает два набора результатов?

Я хотел бы реализовать нечто похожее на то, что делает метод расширения Include() при выборе источника в операторе LINQ.

1 Ответ

0 голосов
/ 05 февраля 2010

Я решил это сам некоторое время назад. Я просто отвечаю на свой вопрос, если кому-то еще это понадобится.

Так какие же результаты должны возвращать хранимые процедуры? Это сильно зависит от типа отношения. Допустим, у нас есть две таблицы: TableOne и TableTwo.

1: 0..1 отношение

В этом случае хранимая процедура должна возвращать оба сразу:

select t1.*, t2.*
from TableOne t1
    [left] join TableTwo t2
    on t2.key = t1.key

Когда они равны 1: 1, вы можете легко опустить left.

1: МНОГИЕ отношения

В этом случае гораздо проще написать хранимые процедуры, которые возвращают больше результатов. Начиная с тех, кто на стороне один , поэтому они будут подготовлены, когда вы связываете много приставной стол.

/* relation one */
select *
from TableOne
/* relation many */
select *
from TableTwo

Но если вы все еще хотите вернуть один набор результатов, вы должны проверить для каждой записи, загружен ли уже определенный объект. Есть метод FindOrAttach (), который может вам помочь. Таким образом, каждый результат будет возвращать обе сущности, и вы должны проверить, загружены ли они. Если нет, материализуйте ... Но, как уже упоминалось, гораздо проще вернуть два набора результатов.

МНОГИЕ: МНОГИЕ отношения

Вы также должны написать свою хранимую процедуру, чтобы получить больше результатов. В данном случае 3 из них.

/* first table */
select *
from TableOne
/* second table */
select *
from TableTwo
/* relation *:* */
select *
from TableOne2Table2

Выполните материализацию первых двух таблиц, как обычно, а затем вызовите Attach для каждой записи из результатов их загрузки с помощью ключей из TableOne и TableTwo. Это также заполняет свойства навигации набора сущностей.

Я дома, это поможет другим, как это помогло мне.

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