从未完成MVC网站我即将开始一个非常大的项目。我有足够的信心去做,但我有一件事我需要帮助搞清楚。
我们肯定会使用“实体优先”方法,并且只有一个.edmx文件来定义模型,这有多种原因,但只知道这是一个明确的难题。
因此,我需要弄清楚的是如何提出一种优雅的方法来对页面上的实体进行验证,而不需要对每个页面进行手动编码,至少对于大多数事情而言。
是否有任何已经流行的方法进行一些基本验证?像MaxLength或必需或MinDate等等?
任何比这更复杂的东西,我知道我必须自己编写代码,但是这个网站会非常大,我真的需要找到一种方法来加速一些基本任务。
修改
我应该指出几个重要的事实
1)我们的数据库已经存在,并且在开发人员进入图片之前由DBA创建
2)已经创建了数百个表和存储过程
3)当需要对数据库进行更改时,他们将通过DBA,我们也不会总是立即访问。
答案 0 :(得分:0)
首先,如果您使用实体框架代码优先,您没有.edxm文件存储您的模型或它们之间的关系:您只需编写您的POCO(普通旧CLR对象)类,就是这样 - 代码首先,将根据命名约定找出模型之间的关系。
要验证您的(查看)模型,建议您使用 FluentValidation 或 DataAnnotations 。两者都允许您在一个位置定义验证规则,使用不同实体验证类(FluentValidation)中的流畅验证API或使用属性来装饰您的实体属性(DataAnnotations)。 DataAnnotations优于FluentValidation的优势在于您可以立即获得额外的客户端验证。
无论您选择哪种框架,都会附带一系列预定义的验证规则,例如必需,范围或 MaxLength (请参阅{{3例如,或Fluent Validation for .NET。
答案 1 :(得分:0)
我绝对会100%使用一些POCO课程。下载DBContext生成器模板,然后从模型中首先创建代码,或使用Entity Framework Power Tools对现有数据库进行反向工程。这些方法的缺点是你不会得到客户端验证,只有在保存它时才会得到验证。但是,如果您选择使用另外的客户端验证,则仍可以添加验证属性 MetaData Classes在您的属性上使用数据注释,并使用内置的jQuery不显眼验证进行客户端验证。
然而 - 我们在这里谈论的是与MVC良好实践的基本设计无关。理想情况下,您的视图应该具有有时只是实体的一部分的ViewModel,在这种情况下,您的验证属性仍然在您的属性上生成为MetaDataClasses中的DataAnnotations。
如果您认为这是太多的工作并且只使用服务器验证并且决定不使用ViewModel并依赖实体框架验证 - 或者使用ViewModel并仍然依赖于EF验证,那么您将需要在您的控制器(或已被授予对ModelState的访问权限的其他层)中的以下处理程序来捕获以下异常。注意我使用AutoMapper将我的ViewModel之间的属性复制到我的实体。
Entity Framework Power Tools(在安装后右键单击解决方案资源管理器中的项目,将会有一个新的'实体框架'菜单 - >逆向工程师 - 请注意它不会生成[TimeStamp]属性并忘记放入模式名称 - 除了它非常好)
[HttpPost]
public ActionResult Create(CustomerCreateViewModel customerViewModel)
{
if (ModelState.IsValid)
{
try
{
Mapper.CreateMap();
Customer customer = Mapper.Map(customerViewModel);
var repository = new CustomerRepository(db);
repository.Save(customer);
return RedirectToAction("Edit", new { id=customer.CustomerId});
}
catch (DbEntityValidationException ex)
{
foreach (var error in ex.EntityValidationErrors.First().ValidationErrors)
{
this.ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
}
return View();
}
}
return View(customerViewModel);
}
答案 2 :(得分:0)
Jon Galloway有一篇名为Generating EF Code First model classes from an existing database的好文章,我认为这篇文章可以帮助你大大提高你的应用程序,并从你所描述的内容开始。
其次,从目前为止构建我们自己的MVC应用程序开始,我发现你真的不会直接直接使用Entity Framework模型。大多数情况下,您最终会得到某种类型的视图模型来进行获取和发布。将DataAnnotations添加到这些类属性将使您可以非常轻松地在客户端进行验证。一旦您从客户端验证了数据并根据任何业务规则检查了您的实体,您就真的应该能够信任这些数据并使用EF来完成基本的CRUD工作。
祝你好运,希望这可以帮助你了解你的项目。
答案 3 :(得分:0)
Marius试图告诉您的是“Code First”是指您的“模型”由不依赖.edmx文件的流畅代码映射定义。因此,如果您使用的是.edmx文件,那么您就不会首先执行“代码”。你正在做“数据库优先”或“模型优先”(两者都使用.edmx)。
在您的情况下,您已经拥有一个数据库,因此您使用的是“数据库优先”方法,使用EF 4.1 DbContext。这不是“代码优先”(或者您错误地声明,实体优先)。这不是语义狡辩,因为“代码优先”具有非常特定的含义。不是这样。
现在,问题的其余部分。由于您的所有数据库访问都必须通过存储过程,因此我认为实体框架不是一个好的选择。你最好使用像nhibernate这样的东西,它有更好的存储过程支持。
EF旨在表示对象中的关系数据模型,并生成所有自己的sql以访问和填充这些对象。如果你必须通过这些细节,EF对你来说将是一场持续的艰难战斗。