2011-02-01 2 views
4

У меня есть объект, называемый Лицом, у которого есть коллекция адресов.C# Entity Framework заполняет частичное свойство

Я создал:

public partial class Person 
{ 
    public int AddressCount{get{return Addresses.Count;}} 
} 

Это возвращает ошибку:

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

Я возвращаю собрание людей, как я могу сделать это, не делая это:

public int AddressCount 
     { 
      get 
      { 
       using (var c = new Entities()) 
       { 
        return c.People.Where(s => s.PersonId == PersonId).Single().Addresses.Count; 
       } 
      } 
     } 
+0

Почему вы не хотите делать это? –

ответ

4

Я обнаружил, что это работает, чтобы нетерпеливый-загружает «рассчитывать» свойство без загрузки всех объектов в сбор:

using (var context = new Entities()) 
{ 
    var people = (from p in c.People 
        select new 
        { 
         Person = p, 
         AddressCount = p.Addresses.Count 
        }).ToList(); 

    foreach (var item in people) 
    { 
     item.Person.AddressCount = item.AddressCount; 
    } 
} 

Недостатком, конечно же, является то, что AddressCount должен быть установлен. Я думаю, вы могли бы дать ему внутренний сеттер, если ваш контекст находится в той же сборке, что и класс сущности.

Возможно, вам не понадобится Include("Addresses") - это стоит проверить. Редактировать удалил его, поскольку он не является обязательным (и на самом деле может заставить запрос работать больше, чем нужно).

+0

избили меня примерно на 15 секунд .. +1 – RPM1984

+0

@ RPM1984 Вы помните, нужен ли вызов Include()? –

+1

с вашего * проецирования * (анонимному типу), нет - это не обязательно, EF получит то, что ему нужно автоматически. – RPM1984

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