【发布时间】:2017-09-29 18:31:21
【问题描述】:
我想,这是一个高层次的问题,更多的是学者而不是挖沟者。
问题一:
在定义与另一个模型的外部关系时,例如一对多关系,通常以以下方式定义:
public virtual ICollection<OtherModel> OtherModel { get; set; }
但是,我也看到它以下列方式定义:
private ICollection<OtherModel> _otherModel;
public virtual ICollection<OtherModel> OtherModel {
get { return _otherModel ?? ( _otherModel = new List<OtherModel>() ); }
set { _otherModel = value }
}
这对我来说确实有意义:如果没有从 OtherModel 引用此模型的条目(空值),则 null-coalescing 运算符确保创建了一个空白的、空的 OtherModel 集合。据我所知,这是一项安全措施。
然而,上述的演变似乎是这样的:
public class ThisModel {
// Assorted model items
public virtual ICollection<OtherModel> OtherModel { get; set; }
public ThisModel(){
OtherModel = new List<OtherModel>();
}
}
不幸的是,我没有看到两者如何等效。当OtherModel 没有引用ThisModel 中的任何内容时,上面的第二个代码块显然使用了空合并运算符来调用空白列表ONLY;当结果列表无论如何都会为空时。
当我阅读第三个代码块时,我将其解释为 OtherModel 的列表,每次都会调用 ThisModel。
我希望有人可以对两者之间的任何差异进行一些澄清。
问题 2:
另一方面,我们要求在 OtherModel 中输入条目。通常我们在OtherModel中建立反向关系是这样的:
public virtual ThisModel ThisModel { get; set; }
但是我也看到它以下列方式定义:
public class OtherModel {
// Various model stuff
private ThisModel _thisModel;
public virtual ThisModel ThisModel {
get { return _thisModel; }
set {
if (value == null) throw new ArgumentNullException(nameof(value));
_thisModel= value;
ThisModelId = value.ThisModelId;
}
}
}
关键是,因为OtherModel 有一个必需的外键,如果该外键最终被强制输入一个空条目,if 语句显式抛出一个空异常。我喜欢这个。它确保对于所需的外键,不能使用或不能引入空值。它确保在 CRUD 操作中的任何内容到达数据库之前很久就完成任何此类拒绝,并充当备份,以防业务逻辑(在堆栈中更高,使用视图模型)意外地没有扩展以涵盖该问题。
在这种情况下,我的问题是如何将其浓缩成更有效的东西。
【问题讨论】:
标签: c# asp.net asp.net-mvc model asp.net-mvc-5