DI与实体框架实体

时间:2016-02-23 12:29:36

标签: c# entity-framework dependency-injection entity-framework-6

我想向实体添加验证类,因此它可以在输入数据库之前检查它是否有效。 (检查是针对业务需求,而不是数据库约束)。

我有班级

--------KEY----------------------------VALUE-----
newrowstart ------------------------newrowstart
LearnerTelephones_ID----------------3797d9ab-df28-423e-b847-f7c1abbac26a
LearnerTelephones_IsFirst-----------FALSE
newrowstart ------------------------newrowstart
LearnerTelephones_L_ID  ------------88a86894-f3fa-4ff0-bb0c-814a2434e841
newrowstart ------------------------newrowstart
LearnerTelephones_Ln_IDNAME---------my name
LearnerTelephones_Ln_IDAdd  --------my id address
newrowend   ------------------------newrowend
newrowstart-------------------------newrowstart
LearnerTelephones_Ln_IDNAME---------my name2
LearnerTelephones_Ln_IDAdd----------my id address2
newrowend   ------------------------newrowend
newrowend                   --------newrowend
LearnerTelephones_Notes     --------null
LearnerTelephones_TelephoneNumber---1234 505050
LearnerTelephones_UseForText--------null
newrowend---------------------------newrowend

使用依赖注入,我很难看到当项目使用EF6时如何干净地解决依赖关系。如果我返回DbSet,它当然不知道验证器的要求。无参数构造函数是必需的。

2 个答案:

答案 0 :(得分:3)

首先,我认为你不应该尝试use DI with your entities。验证应该也可能在您的实体本身内发生,而不是使用外部验证器(传递到Validate方法或使用ValidatorFactory创建)。

实体框架有multiple ways to do validation built in。你试过其中的任何一个吗?

最简单的形式是向属性添加属性,例如RequiredStringLength。要进行更复杂的验证,您可以让实体实施IValidateObject或覆盖DbContext.ValidateEntity

当您调用DbEntityValidationException时,如果验证失败,则会使用这些方法中的任何一个DbContext.SaveChanges。您也可以通过调用DbContext.GetValidationErrors来触发验证而不会抛出异常。

答案 1 :(得分:2)

对外部验证器的需求对我来说就像是一种嗅觉 - 更不用说复杂的ValidatorFactory

如果你想正确地说避免贫血域反模式,你可能还要在实体中包含验证并保留它们valid at all times

另一件对我没有意义的事情是,您确定了4个具有“不同业务要求和验证规则”的实体。 IMO正是在这里你需要ad hoc实体的特殊性,每个实体都在内部强制执行自己的规则,而不是外部Validator抽象的通用性。

关于4个实体的相似部分,即数据,我会尝试将其提取为有意义的Value Objects并组合这些对象的实体。