处理类中的空子对象
本文关键字:对象 处理 | 更新日期: 2023-09-27 18:02:17
我有几个类
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表中没有Institution type的情况。
当我使用下面的代码,没有机构类型数据的记录,我得到一个空引用异常。
cm.InstitutionTypeId = person.Institution.InstitutionType == null ? 0 : contact.Institution.InstitutionType.Id;
这些情况应该如何处理?我的课程应该重新设计吗?
(编辑显示延迟加载代码示例)
目前,在使用可能为null的对象的属性之前,没有办法检查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的Institution type。根据使用这些对象时所需的业务逻辑,这可能是也可能不是最好的方法。由于这些都是实体对象,因此您需要确保理解创建新实例的数据含义,而不是设置对现有默认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 }); }
}
}
通常,您必须问自己:如果数据不存在,您将无法做什么,您想做什么?
在您的示例中,如果person
为空,您将无法执行任何操作。事实上,如果person
为null,您的代码可能永远都不应该被输入,所以这是一个很好的地方,可以抛出ArgumentNullException
或类似的东西。
如果person.Institution
为空,您将无法对机构进行任何操作。您将不得不跳过所有与机构相关的代码,但是您可能希望也可能不希望抛出异常。可能不会。
如果缺少person.Institution.InstitutionType
,则不能对机构类型做任何操作,但您可能会提出默认值。您可能希望将空InstitutionType
视为与ID=0, Name=String的InstitutionType
相同。