【发布时间】:2014-02-07 10:49:48
【问题描述】:
我已经覆盖了我的 db.SaveChanges(),因此我可以在 FluentValidation 验证器实际尝试保存之前调用它。
我为每个标有 IValidatableEntity 的实体都有一个验证器,如果实体匹配,它将调用它并传入 objectStateEntry。
public virtual IEnumerable<string> SaveChanges(User user)
{
List<string> validationErrors = new List<string>();
if (this.Configuration.ValidateOnSaveEnabled)
{
foreach (var entry in ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager
.GetObjectStateEntries(System.Data.Entity.EntityState.Added | System.Data.Entity.EntityState.Deleted | System.Data.Entity.EntityState.Modified | System.Data.Entity.EntityState.Unchanged)
.Where(entry => (entry.Entity is IValidatableEntity)))
{
validationErrors.AddRange(((IValidatableEntity)entry.Entity).Validate(entry));
}
}
if (!validationErrors.Any())
{ .....
我遇到的问题是我得到两种不同的行为,具体取决于我如何将对象添加到 dbContext。我猜是因为它只将聚合根标记为被修改并且只给它一个条目?
// Example A - Calls the Organisation Validator Only
organisation.Client.Add(client);
// Example B - Calls the Client Validator - which is correct
db.Client.Add(client);
是否有让 EF 自动检测子属性已更改(添加/修改)并调用它们的方法?如果没有,它会破坏我的验证模型,我希望更新聚合根并让 EF 调用必要的子验证,因为它们应该有唯一的条目。
我是否必须在我的 Fluent 验证中链接验证器才能捕获这些?我不希望我的流利的验证器必须检查可能数百个子实体的情况。 (有些包含数据库查找等)。
谢谢
【问题讨论】:
标签: c# entity-framework