我们正在使用asp.net 5和带有Onion架构的EF7构建我们的应用程序。我们不知道如何在实体保存在我们的服务层的数据库中之前验证它们。
我们的结构是这样的;
CORE
基础设施
演示
我们的问题是我们不知道如何处理服务层中的验证。 EF7不像过去那样验证实体(https://github.com/aspnet/EntityFramework/wiki/Entity-Framework-Design-Meeting-Notes---July-17,-2014)。我们不希望服务的另一个DTO /模型层在其中放置验证,因为我们在Presentation层中有我们的Model项目。
最好的方法是什么?
编辑:
我们尝试在EF7中使用DbEntityValidationException来处理通过EF的验证,但我们发现它是不可能的。我们还尝试在服务层中为每个DTO设置验证类,但它对我们来说听起来不对,因为它增加了编码的复杂性。 我们也试过以下方法;我们通过reveng工具生成带有数据注释的实体。我们验证了如下的实体类;
public class EntityBase
{
public virtual DateTime CreatedDate { get; set; }
public virtual string CreatedBy { get; set; }
public virtual DateTime ModifiedDate { get; set; }
public virtual string ModifiedBy { get; set; }
public int RowVersion { get; set; }
}
public class MyEntity
{
public virtual int MyEntityId { get; set; }
[MaxLength(50)]
public virtual string Name { get; set;}
}
public static class EntityValidator
{
public static ICollection<ValidationResult> Validate(this EntityBase entity)
{
if (entity == null) return new List<ValidationResult>();
var validationErrors = new List<ValidationResult>();
var context = new ValidationContext(entity, null, null);
var isValid = Validator.TryValidateObject(entity, context, validationErrors,true);
return validationErrors;
}
}
这样我们可以像使用它一样;我们的服务层中的 var errors = myEntity.Validate(); 。
我们仍在寻找更好的解决方案。