2014-05-08 29 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; } 

} 

这个类是使用实体框架,从一个数据库表中的记录拉一个代码第一个模型。通常情况下,Institution表中没有InstitutionType。

当我使用下面的代码,并没有记录的InstitutionType数据时,我得到一个空引用异常。

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

这些情况应该如何处理?我的课程是否应该重新设计?

+0

我编辑了您的标题。请参阅“[应该在标题中是否包含”标签“](http://meta.stackoverflow.com/questions/19190/)”,其中共识是“不,他们不应该”。 –

+0

你是说你在'person.Inceptitution.InstitutionType == null'上得到'NullReferenceException'吗?这只有在'person.Institution'为空时才可能,所以请检查。 –

+0

什么是'cm'变量? – Colin

回答

1

(编辑,以显示延迟加载代码示例)

目前,没有办法使用的可能为null对象的属性绕前检查空引用。

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属性延迟加载新的Institution实例,该实例已使用ID为0的InstitutionType进行初始化。根据使用这些对象时所需的业务逻辑,这可能是也可能不是最好的做法。由于这些是实体对象,因此您需要确保理解创建新实例的数据含义,而不是设置对现有默认Institution或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

我喜欢你说“机构属性延迟加载新机构实例”的概念。 –

+0

任何机会的一些例子或伪代码? –

1

一般来说,你必须问自己:如果数据不存在,你会做什么?你想做什么?

在你的例子中,如果person为空,你将无法做任何事情。事实上,如果person为空,那么你的代码可能永远不会被输入,所以这是一个投掷ArgumentNullException或类似东西的好地方。

如果person.Institution为空,您将无法对机构进行任何操作。你必须跳过所有的代码与机构做的事情,但你可能会或可能不想抛出异常。可能不会。

如果person.Institution.InstitutionType丢失,您无法做任何与机构类型有关的事情,但您可能会想到默认值。您可能想要将空InstitutionType视为空,就好像您拥有ID为0的Name = String.Empty和Active = false的InstitutionType一样。