我正在寻找一些建议。我正在使用EF 5,我有一个通用存储库,它处理与数据库的所有CRUD事务。这很好,但是我想添加一个“Last Gap”安全措施,以确保在数据访问层尝试更改数据库之前实体是有效的。
在我做这样的事情之前: -
DataLayer.Create<TEntity>(entity);
如果验证失败,我想验证实体并抛出异常。
你们会用什么作为首选方法?
答案 0 :(得分:2)
您可以直接在实体中使用数据注释。使用数据注释,EF将为您验证属性,如果它无效,将抛出异常。
例如,如果您需要Name
,则可以执行以下操作:
public class Person
{
[Required]
public string Name { get; set; }
// other members
}
除了验证之外,EF还会将相应的列设置为not null
,而不是字符串的默认null
。
如果您不想使用数据注释丢弃实体,则可以使用流畅的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,可能不适用于其他工作流程。
答案 1 :(得分:2)
有时您必须转到数据库以检查插入或更新实体是否使存储库保持有效状态 - 例如,当您需要确保自然键是唯一的时。虽然已经讨论过,但目前还没有由数据注释或Fluent API处理。请参阅unique constraints in entity framework以及此work item。
与此同时,当您必须转到数据库时,DbContext
将涉及某个地方,DbContext
有一个名为ValidateEntity
的可覆盖方法。请参阅此文章:Entity Framework Validation。
我将我使用的代码放在另一个答案here
中更多关于我structured the validation in MVC的信息。
答案 2 :(得分:1)
我不会在DAL进行验证,但如果你这样做,你可能对Validation with the Data Annotation Validators感兴趣