2010-06-03 2 views
1

Как проверить, заполнен ли дочерний объект объекта linq или нет? Пример кода ниже.Как проверить, заполнен ли дочерний объект

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

public static Member GetMemberWithPhoto(Guid memberId) 
{ 
    using (DataContext db = new DataContext()) 
    { 
     DataLoadOptions dataLoadOptions = new DataLoadOptions(); 
     dataLoadOptions.LoadWith<Member>(x => x.UserPhoto); 
     db.LoadOptions = dataLoadOptions; 

     var query = from x in db.Members 
        where x.MemberId == memberId 
        select x; 

     return query.FirstOrDefault(); 
    } 
} 

public static Member GetMember(Guid memberId) 
{ 
    using (DataContext db = new DataContext()) 
    { 
     var query = from x in db.Members 
        where x.MemberId == memberId 
        select x; 

     return query.FirstOrDefault(); 
    } 
} 

Тогда мой управления имеют следующий код:

Member member1 = Member.GetMemberWithPhoto(memberId); 
Member member2 = Member.GetMember(memberId); 

Debug.WriteLine(member1.UserPhoto.ToString()); 
Debug.WriteLine(member2.UserPhoto.ToString()); 

Последняя строка будет генерировать «не может доступ к удаленному объекту ". Я знаю, что я могу избавиться от этого исключения, просто не удалив datacontext, но тогда последняя строка создаст новый запрос к базе данных, и я не хочу этого.

Что я хотел бы что-то вроде:

Debug.WriteLine((member1.UserPhoto.IsPopulated()) ? member1.UserPhoto.ToString() : "none"); 
Debug.WriteLine((member2.UserPhoto.IsPopulated()) ? member2.UserPhoto.ToString() : "none"); 

Возможно ли это?

ответ

1

Свойство Settings определено как EntitySet? Если это так, то вы должны иметь возможность проверить свойство HasLoadedOrAssignedValues:

Debug.WriteLine(member1.Settings.HasLoadedOrAssignedValues ? member2.Settings.Count : -1); 
+0

Вы, конечно, правильно. Я только что понял, что код, с которым я столкнулся, не является сущностью, а отношением «один к одному» в базе данных. Я соответствующим образом обновил этот вопрос. – TheQ

+0

Что представляет собой аксессуар свойств для взаимно однозначного? Получает ли он доступ к полю типа EntityRef ? Если это так, вы можете создать другое свойство IsUserPhotoPopulated (возможно, в частичном классе), которое выполняет проверку в поле следующим образом: _userPhoto.HasLoadedOrAssignedValue. Или измените логику геттера, чтобы выполнить эту проверку, хотя она будет перезаписана при регенерации вашей модели сущности (если она была автоматически сгенерирована). – luksan

+0

Объекты Member и UserPhoto автоматически генерируются из соответствующих таблиц через dbml-файл в visual studio, и насколько я могу судить, нет EntityRef где угодно. Я мог бы создавать новые свойства в частичных классах, но я не знаю, поможет ли это. Я мог бы изменить логику запросов, но это большой проект с большим количеством старого кода, некоторые присоединяются к данным, а некоторые нет, поэтому я предпочел бы, если будет существовать другой метод. – TheQ

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