我正在寻求一些建议。我正在使用 EF 5,并且我有一个通用存储库来处理与数据库的所有 CRUD 事务。这工作正常,但我想添加一个“最后间隙”保护措施,以确保实体在数据访问层尝试更改数据库之前有效。
就在我做这样的事情之前:-
DataLayer.Create<TEntity>(entity);
我想验证实体并在验证失败时抛出异常。
你们会使用什么作为首选方法?
我正在寻求一些建议。我正在使用 EF 5,并且我有一个通用存储库来处理与数据库的所有 CRUD 事务。这工作正常,但我想添加一个“最后间隙”保护措施,以确保实体在数据访问层尝试更改数据库之前有效。
就在我做这样的事情之前:-
DataLayer.Create<TEntity>(entity);
我想验证实体并在验证失败时抛出异常。
你们会使用什么作为首选方法?
您可以直接在实体中使用数据注释。使用数据注释,EF 将为您验证属性,如果它无效,则会引发异常。
例如,如果您想Name
被要求,您可以执行以下操作:
public class Person
{
[Required]
public string Name { get; set; }
// other members
}
除了验证之外,EF 还将相应的列设置为而不是字符串not null
的默认值。null
如果您不想在实体中乱扔数据注释,则可以改用 fluent API。以下是上述代码的等价物:
public class MyContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Entity<Person>().Property(p => p.Name).IsRequired();
}
// other members
}
我的回答适用于 EF Code First,可能不适用于其他工作流程。
有时您必须去数据库检查插入或更新实体是否使存储库保持有效状态 - 例如当您需要确保自然键是唯一的时。尽管已经讨论过,但目前还没有由数据注释或 Fluent API 处理。请参阅实体框架中的唯一约束和此工作项。
同时,当您必须访问数据库时,DbContext
将涉及到某个地方,并且DbContext
有一个称为 Overridable 的方法ValidateEntity
。请参阅这篇文章:实体框架验证。
我把我在另一个答案中使用的代码放在这里
以及更多关于我如何在 MVC 中构建验证的信息。
我不会在 DAL 进行验证,但如果你这样做,你可能会对使用 Data Annotation Validators 进行验证感兴趣