Поведение при загрузке EF v1? - PullRequest
3 голосов
/ 24 августа 2010

другой вопрос Entity Framework (ADO.NET) от меня.Я использую EF1 (выбора там нет) и имею базу данных MySQL в качестве бэкэнда.

Простой вопрос, на который я не могу найти удовлетворительный ответ:

Что именно у меня естьделать для загрузки?То есть, когда у меня есть сущность, и я хочу перечислить через ее дочерние элементы, скажем, у меня есть сущность "Группа", и у нее есть дочерняя "Пользователь", и я хочу сделать "из n в g.Users, где n.UserID =4 выберите n ", мне сначала нужно вызвать g.Users.Load ();

Это немного раздражает, потому что когда я делаю запрос к незагруженной коллекции, я ожидаю, что EF загрузитсяэто автоматически - по крайней мере, выдает какое-то исключение, а не просто возвращает 0 результатов?

Другой случай, когда мне приходится заботиться о загрузке: у меня есть запрос:

from n in Users where n.Group.Name == "bla" select n

По какой-то причинедает сбой, давая нулевой указатель для n.Group, даже если n.GroupID (ключ для группы) установлен правильно.Кроме того, когда я выполняю Server.Groups.Load () (группы являются дочерними элементами одного сервера), это работает.

Существует ли какая-либо конкретная политика относительно того, когда вызывать Load () из какой коллекции?

Еще раз спасибо, Майкл

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

В первой версии платформы сущностей нет отложенной загрузки. Каждый раз, когда вы хотите получить доступ к чему-то, что вы ранее не загружали, будь то ссылка на отдельный объект или набор объектов, вам придется либо явно указать это, чтобы загрузить эту ссылку. Параметр Include () (сначала из Rup выше) попытается загрузить все необходимые данные в одном большом запросе и вызове обработки, в результате чего Include () будет выполняться медленно. Другой метод (второй из Rup выше), проверяющий и затем загружающий выгруженные ссылки, работал намного быстрее и позволил нам ограничить загрузку до того, что нам нужно.

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

1 голос
/ 24 августа 2010

Вы имеете в виду ObjectQuery.Include , например,

var g = from g in MyDb.Groups.Include("Users") where g.Id = 123 select g;
from n in g.Users where n.UserID = 4 select n

from n in Users.Include("Group") where n.Group.Name == "bla" select n

Вы также можете обернуть Load() s в чек, если вы беспокоитесь об их чрезмерном использовании,

if (g.CanLoadReferences() && !g.Users.IsLoaded)
{
    g.Users.Load();
}

(извинения за любые глупые синтаксические ошибки здесь - я использую другой синтаксис LINQ и EF4 сейчас)

0 голосов
/ 24 августа 2010

Это работает, когда мы работаем с сервером MS SQL, это может быть ограничением в MySQL Adapter.

Используете ли вы последнюю версию 6.2.3? Смотри: http://www.mysql.com/downloads/connector/net

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