自定义ValidateEntity实体验证及DB层面【Interception】拦截EF中的Execute

一:ef的注入或者拦截或者扩展

1. DBContext。。。 是否有被注入的点。。。

Controller下面有很多的override行为。。。

《1》 ShouldValidateEntity 是否需要验证实体

触发点: SaveChanges的时候 (CURD)一些操作。

针对这些操作,我们可能会有一些entity的针对性的验证操作。。。

jquery.validator...
mvc中的 binding的操作。【DataAnotation】

《2》 ValidateEntity 具体的验证行为

《3》SaveChange的源代码中进行ShouldValidateEntity角度分析

用ILSpy搞定。。。

// System.Data.Entity.Internal.InternalContext
public virtual int SaveChanges()
{
int result;
try
{
if (this.ValidateOnSaveEnabled)
{
IEnumerable<DbEntityValidationResult> validationErrors = this.Owner.GetValidationErrors();
if (validationErrors.Any<DbEntityValidationResult>())
{
throw new DbEntityValidationException(Strings.DbEntityValidationException_ValidationFailed, validationErrors);
}
}
bool flag = this.AutoDetectChangesEnabled && !this.ValidateOnSaveEnabled;
SaveOptions options = SaveOptions.AcceptAllChangesAfterSave | (flag ? SaveOptions.DetectChangesBeforeSave : SaveOptions.None);
result = this.ObjectContext.SaveChanges(options);
}
catch (UpdateException updateException)
{
throw this.WrapUpdateException(updateException);
}
return result;
}

public IEnumerable<DbEntityValidationResult> GetValidationErrors()
{
List<DbEntityValidationResult> list = new List<DbEntityValidationResult>();
foreach (DbEntityEntry current in this.ChangeTracker.Entries())
{
if (current.InternalEntry.EntityType != typeof(EdmMetadata) && this.ShouldValidateEntity(current))
{
DbEntityValidationResult dbEntityValidationResult = this.ValidateEntity(current, new Dictionary<object, object>());
if (dbEntityValidationResult != null && !dbEntityValidationResult.IsValid)
{
list.Add(dbEntityValidationResult);
}
}
}
return list;
}

三:对StudentName进行验证

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
//开始做自定义验证: 比如我们的StudentName的值必须不能是“test”。如果是test将会抛出异常

return base.ValidateEntity(entityEntry, items);
}

if (this.ValidateOnSaveEnabled)
{
IEnumerable<DbEntityValidationResult> validationErrors = this.Owner.GetValidationErrors();
if (validationErrors.Any<DbEntityValidationResult>())
{
throw new DbEntityValidationException(Strings.DbEntityValidationException_ValidationFailed, validationErrors);
}
}

四: 在CURD的Database层面进行拦截,进行监控,这样的话方便我们记录log。。。

核心接口: IDbCommandInterceptor

1. 自定义类实现接口

2. 注入到entity framework中。。。通过appconfig的形式。。。

UPDATE [dbo].[Student]
SET [StudentName] = @0
WHERE ([StudentID] = @1)
SELECT [RowVersion]
FROM [dbo].[Student]
WHERE @@ROWCOUNT > 0 AND [StudentID] = @1

记录日志。。。

DataBase.Log 方法。。。。

时间: 2024-10-14 11:20:13

自定义ValidateEntity实体验证及DB层面【Interception】拦截EF中的Execute的相关文章

mvc 对一个或者多个实体验证失败

为了解决“对一个或者多个实体验证失败”,关闭调用SaveChanges() 的实体属性合法性验证(谨慎使用) db.Configuration.ValidateOnSaveEnabled = false; db.SaveChanges();

asp.net mvc4 在EF新增的时候报对一个实体或多个实体验证失败

//entity为空 是数据库上下文会验证实体验证 var entity = db.UserInfo.Where(u => u.Mobile == mobile).FirstOrDefault(); if (entity != null) { MobileLogModel.AddMobileLog(dvid, dvType, "用户注册", "手机已注册", "UserInfo-Register"); return Json(result,

jquery.validate.js之自定义表单验证规则

1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <script type="text/javascript" src="jquery-1.8.3.js"></script> 5 <script type="text/jav

【WCF】Silverlight+wcf+自定义用户名密码验证

本文摘自 http://www.cnblogs.com/virusswb/archive/2010/01/26/1656543.html 在昨天的博文Silverlight3+wcf+在不使用证书的情况下自定义用户名密码验证 中提到了,我想实现的安全效果,就是客户端访问的时候不需要https,也不需要安装证书(商业证书客户端会自动信任),但是暴露的wcf接口不是每个人可以调用的,因为sl+wcf只支持basicHttpBinding一种绑定,在这种绑定下面其实是可以不适用传输安全,然后消息安全选

WCF 安全性之 自定义用户名密码验证

案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxpp/p/6232298.html X509证书创建 http://www.cnblogs.com/woxpp/p/6232325.html 自定义用户名密码验证需要证书的支持 服务器端配置代码 <system.serviceModel> <services> <service n

jquery.validate.js使用之自定义表单验证规则

jquery.validate.js使用之自定义表单验证规则,下面列出了一些常用的验证法规则 jquery.validate.js演示查看 jquery validate强大的jquery表单验证插件 http://www.51xuediannao.com/js/jquery/jquery_validate/ ======================================================== //扩展验证规则 //邮箱 表单验证规则jQuery.validator.

easyUI 验证控件应用、自定义、扩展验证 手机号码或电话话码格式

easyUI 验证控件应用.自定义.扩展验证 手机号码或电话话码格式 在API中   发现给的demo 中没有这个验证,所以就研究了下. 相关介绍省略,直接上代码吧! <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-eq

自定义Mvc5 Owin 验证

public class AuthIn : IUserAuthenticate { public static ApplicationUserManager UserManager { get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); } } private IAuthenticationManager AuthenticationManager { get {

在自定义的js验证规则中调用magento的VarienForm方法验证表单

js部分<script type="text/javascript"> //<![CDATA[ var loginForm = new VarienForm('login-form', true); $('login-email').observe('keypress', bindLoginPost); $('login-password').observe('keypress', bindLoginPost); function bindLoginPost(evt)