2014-05-08 8 views
0

У меня есть несколько классовРабота с нулевым объектом в классе?

public class Person 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public virtual Institution Institution{get; set;}  
} 
public class Institution 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public virtual InstitutionType InstitutionType { get; set; } 

} 
public class InstitutionType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool Active { get; set; } 
    public virtual ICollection<Institution> Institutions { get; set; } 

} 

Этот класс является код первой моделью, которая использует Entity Framework тянуть записей из таблиц в БД. Часто бывают ситуации, когда в таблице Institution нет типа InstitutionType.

Когда я использую следующий код, и нет данных InstitutionType для записи, я получаю Null Reference Exception.

cm.InstitutionTypeId = person.Institution.InstitutionType == null ? 0 : contact.Institution.InstitutionType.Id; 

Как следует справляться с этими ситуациями? Должны ли мои классы быть переработаны?

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackoverflow.com/questions/19190/)», где консенсус «нет, они не должны». –

+0

Вы говорите, что вы получаете 'NullReferenceException' на' person.Institution.InstitutionType == null'? Это возможно только в том случае, если 'person.Institution' равно null, поэтому проверьте это. –

+0

Что такое переменная 'cm'? – Colin

ответ

1

(ред показать ленивый образец загрузки коды)

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

cm.InstitutionTypeId = (person.Insitituion != null && person.Institution.InstitutionType != null) ? contact.Institution.InstitutionType.Id : 0; 

C# в настоящее время не имеют безопасный оператор навигации, но в соответствии с этим:

http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx

Мы, вероятно, получить один в ближайшее время: "?".

В качестве альтернативы вы можете иметь свойство Institution lazy загрузить новый экземпляр Institution, который инициализируется с InstitutionType, идентификатор которого равен 0. В зависимости от бизнес-логики, которая вам нужна при использовании этих объектов, это может быть или не быть лучшим подход. Поскольку они являются объектами сущности, вы захотите убедиться, что вы понимаете последствия данных для создания новых экземпляров, вместо того, чтобы, возможно, устанавливать ссылку на существующий Учреждение по умолчанию или InstitutionType. Надеюсь это поможет.

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    private Institution _Institution; 
    public Institution Institution 
    { 
     get { return _Institution ?? (_Institution = new Institution()); } 
    } 

} 
public class Institution 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    private InstitutionType _InstitutionType; 
    public InstitutionType InstitutionType 
    { 
     get { return _InstitutionType ?? (_InstitutionType = new InstitutionType() { Id = 0 }); } 
    } 

} 
+0

Мне нравится концепция, согласно которой вы указываете «свойство Institution lazy load new Institution instance». –

+0

Возможны ли какие-либо примеры или псевдокоды? –

1

В общем, вы должны спросить себя: что вы не сможете сделать, если данных нет, и что вы хотите сделать вместо этого?

В вашем примере вы не сможете ничего сделать, если person равно null. На самом деле, ваш код, вероятно, никогда не был бы введен, если person имеет значение NULL, так что это хорошее место, чтобы выбросить ArgumentNullException или что-то в этом роде.

Вы не сможете ничего сделать с учреждениями, если person.Institution null. Вам придется пропустить весь код, который делает вещи с учреждениями, но вы можете или не захотите выбросить исключение. Возможно нет.

Вы не можете ничего сделать с типом учреждения, если отсутствует person.Institution.InstitutionType, но вы, вероятно, можете найти значения по умолчанию. Возможно, вы захотите обработать нуль InstitutionType так же, как если бы у вас был InstitutionType с ID = 0, Name = String.Empty и Active = false.