asp.net-mvc - 关于模型验证,EF4 代码优先与模型优先

标签 asp.net-mvc entity-framework entity-framework-4 data-annotations code-first

我正在开发一个单人 ASP.NET MVC 3 项目(我可以完全控制数据库架构和代码),我正在尝试在使用我的 EF4 模型的数据库优先和 POCO 之间做出决定,或者如果我应该以代码为先。

我试图实现的主要目标是用 DataAnnotation 属性装饰我的模型,以便我可以在执行任何持久性之前强制执行模式验证。看着 Scott Guthrie's article关于使用 MVC 2 进行模型验证,他谈到了关于使用代码优先(第 2 步)和使用“伙伴类”(第 5 步)以模型优先(或数据库优先)进行验证的文章。

我过去一直使用 SQL Server 设计器 GUI(和脚本)完成我的数据库设计,所以我肯定会更有效率,严格来说,在数据库设计方面。但是,除非我放弃使用 DataAnnotation 属性来装饰模型以进行验证的想法,否则我不仅会在两个类中拥有模型属性,而且本质上还必须在两个地方构建我的模式,这将违反 DRY。

我正在寻找对这两种方法(甚至一种方法)都有经验的人,并且可以就他们采用的方式、为什么决定这样做以及他们如何发现它起作用提供反馈。我还想知道我是否最好采用完全不同的方法,使用 Fluent Validation 之类的工具,或者甚至完全放弃域模型级验证,并将我的验证保留在服务和 View 模型中。

最佳答案

First Code First 在 CTP 中,因此没有上线许可证。如果这是一个将在 future 几个月内交付的项目,那么决定是模型优先。

话虽如此,使用 DataAnnotations 的 Code First 类比使用伙伴类的 Model First POCO 更干净,但在我的经验中最重要的是明确的意图。只要您的设计清晰且最重要的是一致,任何一种方法都是合适的。

对于一个小项目(即你所说的一个人),我会说你可能会更高效地使用 Model First 并通过 edmx 进行设计。这也会让您从架构优先背景中感到更舒服。然而,为了使 POCO 类正常工作,您需要跳过许多环节,例如安装 POCO T4 模板,然后修改项目中创建的 T4 模板以将 POCO 拉入单独的程序集。您不希望它们出现在 DAL 程序集中,这是它们开始的地方。然后,您需要决定是否适合使用部分类来实现 DataAnnotations;出于我不同意很多人认为这些设计不佳的原因。

在 MVC 项目中,当您决定使用 ViewModel 时,您将使用 DataAnnotations 和任一方法遇到普遍存在的 DRY 问题。在这一点上,您会突然意识到用于验证的模型的大量注释只有在您乐于将这些类直接发送到 View 时才有用。如果您决定保持 View 轻量级并使用 ViewModel,您必须在 ViewModel 上重复 DataAnnotations,否则您会在模型级别留下验证错误,但除了手动添加之外,无法将其放入 ModelState。代码优先或模型优先都没有解决这个问题,所以你需要相应地设计。我们个人采用了混合并接受了突破 DRY 的水平。

关于asp.net-mvc - 关于模型验证,EF4 代码优先与模型优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5150795/

相关文章:

c# - 在这种情况下我应该使用什么正确的数据类型?

c# - Linq to SQL - 在 Html.TextBoxFor 中格式化 DateTime

ASP.NET MVC Head Verb 和 Selenium RC

c# - ASP.NET Core 项目 - 发布不显示 "Database Migrations"选项

mysql - 将 Entity Framework 模型与 MySQL 服务器一起使用需要哪些步骤?

entity-framework - 如何将继承鉴别器映射为 Entity Framework 中的组合键?

entity-framework-4 - 我可以使用Entity Framework 4 CTP5访问TPH映射中的鉴别符值吗

c# - 在客户端验证 MVC 字段

asp.net-mvc - OutputCache 不缓存 RedirectResult

c# - Entity Framework 4.0 中的反序列化问题