我们是否同意在自动生成的POCO实体(如使用EF 4.x Dbcontext Generator模板)之上添加验证属性是没有意义的?
因为每次运行工具时都会删除属性。
我的问题是:有没有办法一方面维护自动生成的pocos实体,另一方面维护验证属性?
似乎可以使用代码优先方法吗?
实际上我用数据库第一种方法开始我的项目并自动生成我的POCO。是否有可能摆脱.tt文件,保留生成的pocos并使用代码第一种方法来管理新字段,验证属性(等等......)? POCO上的更改是否会更新我的数据库表?
非常感谢您的灯光。
答案 0 :(得分:1)
如果你真的在做“代码优先”的方法,那就意味着“代码就是老板”。您不应该反复运行代码生成器来更新代码 - 您应该自己直接更新POCO。
当然,在项目开始时从数据库生成代码生成POCO可能有意义,节省了大量工作。但是不打算继续这样做 - 你会遇到你提到的问题。
如果你想做一个“数据库优先”方法,在数据库中进行更改,你的POCO将是次要的东西,重新生成 - 有点混淆谁是“老板”。
所以我认为(正如你所说)“保持生成的pocos并使用代码第一种方法来管理新字段,验证属性(等等......)”是有意义的。
关于“POCO上的更改是否会更新我的数据库表?” - 它不应该,除非你有一些设置来重新生成数据库。
注意:我来自NHibernate背景,而不是EF,但适用相同的概念。
答案 1 :(得分:1)
这里有几个问题。首先,您要尝试在数据模型类上放置验证属性。这意味着您将数据对象直接传递给视图。虽然这有效,但这不是推荐的方法。
您应该让视图模型只包含任何给定视图所需的信息,并且这些视图模型具有您的验证属性。然后,在业务逻辑中,将视图模型映射到数据模型。
但是,如果您受到约束并决定在视图中使用数据模型,那么您将使用所谓的“伙伴类”将验证器添加到元数据类中。
http://hartzer.wordpress.com/2010/01/26/mvc-buddy-class/
最后,如果您想首先使用Code,您会发现Code First的工作方式与数据库优先级完全不同。虽然您可以获取生成的实体然后将它们映射到Code First映射,但使用Entity Framework Power Tools CTP1将数据库反向工程到代码优先模型要容易得多,因为这也会创建映射。