在我的数据库模型中,我有一个导航属性,它不能为null。然而,由于变量可能尚未加载,因此在运行时它可以为null。
根据 Microsoft文档, 这个问题可以通过在getter中抛出异常来解决。但是,所有在getter中抛出的异常都不会被全局异常处理器捕获。一旦异常被抛出,代码的执行立即停止。
根据 Microsoft建议, 应该避免在getters中抛出异常。同时,这个 Stackoverflow线程也建议不要在getters中使用异常。
另一种方法是使属性可为空。但是如果这样做,我必须在每个单独的函数中检查属性是否为空,这似乎不够DRY(Don't Repeat Yourself)。
因为我们有一个庞大的代码库,这可能会变得非常混乱。特别是在链式调用中,像这样:
我有什么遗漏吗?在这种情况下,什么被认为是最佳实践?
public class Car {
private Brand? _brand = null
public Brand Brand {
set => _brand = value;
get => _brand ?? throw new InvalidOperationException("Uninitialized property: " + nameof(Brand ));
}
public string GetBrandLocation(){
return this.Brand.Location;
}
}
根据 Microsoft文档, 这个问题可以通过在getter中抛出异常来解决。但是,所有在getter中抛出的异常都不会被全局异常处理器捕获。一旦异常被抛出,代码的执行立即停止。
根据 Microsoft建议, 应该避免在getters中抛出异常。同时,这个 Stackoverflow线程也建议不要在getters中使用异常。
另一种方法是使属性可为空。但是如果这样做,我必须在每个单独的函数中检查属性是否为空,这似乎不够DRY(Don't Repeat Yourself)。
public class Car {
private Brand? _brand = null
public Brand? Brand {
set => _brand = value;
get => _brand;
}
public string GetBrandLocation(){
if(this.Brand == null){
throw new InvalidOperationException("Uninitialized property: " + nameof(Brand ));
}
return this.Brand.Location;
}
}
因为我们有一个庞大的代码库,这可能会变得非常混乱。特别是在链式调用中,像这样:
return Car.Brand.Adress.Street
我有什么遗漏吗?在这种情况下,什么被认为是最佳实践?
#nullable
注解仍然不足以覆盖像 EF 实体类型这样的_可变_对象。我不知道 EFCore 团队具体推荐什么,但在我的情况下,我使用 T4 工具生成接口类型和不可变类来表示带有非空导航属性的“已加载...”实体 - 尽管它们是不可变的且本身不是实体类型。结果可能因人而异。 - Dai#nullable
注释仍然不足以覆盖EF实体类型等_可变_对象。我不知道EFCore团队具体推荐什么,但在我的情况下,我使用T4工具生成接口类型和不可变类来表示具有非空导航属性的“已加载...”实体 - 尽管它们是不可变的并且本身不是实体类型。结果可能因人而异。 - Dai