如何使Fluent API配置与MVC客户端validation一起工作?

我更喜欢使用Fluent API配置到DataAnnotation,因为我想将模型与数据访问分开。

我在MVC中尝试过,Fluent API不能与客户端validation一起使用。 简而言之,有一种简单的方法可以使Fluent API与客户端validation一起工作,因为DataAnnotation可以做到吗?

不.Fluent API只是映射 – 正确。 数据注释都是映射和validation – 错误。 数据注释首先是EF代码最糟糕的特性之一,因为在使用这种方式时,它们将持久性与表示和validation逻辑相结合。

建议:不要使用EF实体进行演示。 使用带有数据注释的特殊视图模型,让控制器从实体准备视图模型,反之亦然。 您或者稍后会发现您的映射不是1:1的情况,或者您的视图需要的数据多于或少于实体类型中提供的数据。 使用视图模型,这些情况将由他们处理。

我今天挣扎了一段时间,这不是严格的客户端validation,因为它需要往返,但它确实允许您从标准模板中的validation摘要和消息帮助程序中受益。 在您的控制器操作方法中,您只需将您的SaveChanges()调用包装在try-catch中,并将生成的错误添加到ModelState ,如下所示:

 try { //This does not pick up fluent validation failures if (ModelState.IsValid) { db.Entity.Add(entity); db.SaveChanges(); //Users want to create loads of my entities without seeing the index... return RedirectToAction("Create"); } } catch (DbEntityValidationException e) { //Log errors foreach (var result in e.EntityValidationErrors) { foreach(var error in result.ValidationErrors){ ModelState.AddModelError(error.PropertyName, error.ErrorMessage); } } } //return to view with current model + validation errors return View(entity) 

如果你在这里保存多个实体,这当然需要更多的工作。

当然使用像Ladislav建议的View Model对象是正确的方法,但是我已经使用它来支持提前下游系统集成测试所要求的测试UI …