2009-06-23 3 views
7

В ADO.Net Entity Framework у меня есть объект, который имеет 4 ссылки на другие объекты. По какой-то причине, когда я запрашиваю эти ссылки, два из них загружаются автоматически (как и ожидалось), а два из них всегда возвращают null.Ссылки на Entity Framework не загружаются автоматически

Причудливо достаточно, когда я вручную спрашивайте ссылки для загрузки, они загружают только денди.

В качестве примера:

if (account.HoldingEntity == null && 
    account.HoldingEntityReference.EntityKey != null) { 

    account.HoldingEntityReference.Load(); 
    account.HoldingEntity = account.HoldingEntityReference.Value; 
} 

Когда я первый проверить HoldingEntity это всегда нуль, однако нагрузка будет возвращать HoldingEntity без проблем.

Любые подсказки?

Спасибо!

ответ

7

Использование ADO.NET Entities, необходимо указать, какие объекты вы хотите автоматически загружать с Include, как в

Dim entity = (From e in db.Entities.Include("SubEntity")) 
+0

Совершенных, что решило его, спасибо! Я догадываюсь, что я все еще не понимаю, так это, почему две ссылки загружаются автоматически, а двое из них нет? – gerrod

+0

Это не совсем так (по крайней мере, с EF 4, я никогда не работал с EF 1). Вы можете указать, какие ссылки вы хотите загружать автоматически (и сразу), но вы также можете полагаться на ленивую загрузку для загрузки по мере необходимости. Тем не менее, ленивая загрузка кажется сломанной даже в EF 4, поэтому, вероятно, это правильный ответ с практической точки зрения. См. Http://msdn.microsoft.com/en-us/library/bb896272.aspx –

0

Это было сделано в EF v1 как дизайнерское решение, и многие разработчики на самом деле предпочитают иметь явный контроль над тем, будут ли загружены ссылочные свойства.

Для EF v4, выходящего с .NET 4.0 до конца 2009 года, у вас будет возможность включить автоматическую отложенную загрузку, если хотите. См. this blog post в блоге команды ADO.NET для получения дополнительной информации об отложенной загрузке в EF v4.

Марк

+0

Это правда, Марк, но проблема с отложенной загрузкой заключается в том, что в базе данных много запросов, и их следует использовать с умом. В зависимости от того, что вам нужно, просто предварительно загрузить объекты. –

5

Как уже сказали, что нужно .Include() в v1, чтобы избежать необходимости вызвать .Load()

В 4.0 вы сможете установить DeferredLoadingEnable д на вашем ObjectContext (я думаю, что мы меняем это имя к более подходящему LazyLoadingEnabled во времени для Beta2).

Что касается того, почему вы все равно уже загрузили 2 отношения. Вероятно, это побочный эффект чего-то, называемого Relationship Fix-up.

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

Надеется, что это помогает

Приветствия Alex

+0

Ах! Спасибо за это, имеет смысл. – gerrod

+0

Как автоматически устанавливаются отношения и есть ли способ отключить это? Это вызывает некоторые серьезные побочные эффекты для меня, потому что это засыпки объектов. Благодаря! – strongriley

Смежные вопросы