我有一个具有集合属性的实体,看起来像这样:
public class MyEntity
{
public virtual ICollection<OtherEntity> Others { get; set; }
}
当我通过数据上下文或存储库检索此实体时,我想防止其他人通过使用MyEntity.Others.Add(entity)
. 这是因为我可能希望在将我的实体添加到集合之前执行一些验证代码。我会通过提供这样的方法来做到这MyEntity
一点:
public void AddOther(OtherEntity other)
{
// perform validation code here
this.Others.Add(other);
}
到目前为止,我已经测试了一些东西,我最终得出的结果是这样的。我在我的实体上创建了一个private
集合并公开了一个public ReadOnlyCollection<T>
如下MyEntity
所示的:
public class MyEntity
{
private readonly ICollection<OtherEntity> _others = new Collection<OtherEntity>();
public virtual IEnumerable<OtherEntity>
{
get
{
return _others.AsEnumerable();
}
}
}
这似乎是我正在寻找的,我的单元测试通过了,但我还没有开始做任何集成测试,所以我想知道:
- 有没有更好的方法来实现我正在寻找的东西?
- 如果我决定走这条路(如果可行),我将面临什么影响?
始终感谢您的任何帮助。
编辑 1我已从使用 a 更改为ReadOnlyCollection
正在IEnumerable
使用return _others.AsEnumerable();
作为我的吸气剂。单元测试再次顺利通过,但我不确定在集成过程中将面临的问题,EF 开始使用相关实体构建这些集合。
编辑 2因此,我决定尝试创建派生集合(调用它ValidatableCollection
)的建议,实现ICollection
我的.Add()
方法在将提供的实体添加到内部集合之前对其执行验证的位置。不幸的是,Entity Framework 在构建导航属性时调用了这个方法——所以它并不适合。