EF6+MVC刷新模型后数据注解丢失,验证规则失效求助
解决EF6元数据类验证不生效的问题
看起来你的问题出在分部类的定义方式以及元数据类的字段/属性匹配上,我来一步步帮你修正:
1. 核心问题分析
- 你把
TaClient分部类嵌套在了PartialClasses类里面,这会导致MVC无法将元数据和自动生成的TaClient类关联起来——分部类必须是同命名空间下的独立类,不能嵌套。 - 元数据类里你用的是字段(比如
public string FirstName;),但自动生成的模型类里是属性(public string FirstName { get; set; }),MVC的验证系统只会识别元数据类里的属性,字段不会生效。
2. 修正后的代码示例
元数据类(改为属性)
using System.ComponentModel.DataAnnotations; using System.ComponentModel; public class TaClientMetadata { [StringLength(50)] [Display(Name = "First Name")] public string FirstName { get; set; } // 改为属性,和模型类匹配 [StringLength(50)] [Display(Name = "Last Name")] public string LastName { get; set; } [Range(3, 10)] [Display(Name = "Age")] public int Age { get; set; } }
正确的分部类(独立定义,同命名空间)
首先,找到自动生成的TaClient类的命名空间(比如自动生成的类开头会有namespace YourProjectName.Models),然后在同一个命名空间下创建分部类:
using System.ComponentModel.DataAnnotations; // 必须和自动生成的TaClient类在同一个命名空间下 namespace YourProjectName.Models { [MetadataType(typeof(TaClientMetadata))] public partial class TaClient { // 这里不需要加任何额外代码,只需要标记元数据属性即可 } }
3. 关键注意事项
- 命名空间一致:自动生成的模型类(比如从EDMX生成的)有自己的命名空间,你的分部类必须和它完全相同,否则编译器不会把它们当作同一个类的分部实现。
- 不要修改自动生成的模型类:以后刷新模型(从数据库更新EDMX)时,自动生成的代码会被覆盖,但你的分部类和元数据类完全独立,不会受到影响。
- 验证生效测试:修改后重新编译项目,再测试年龄输入11的情况,应该会触发验证错误,阻止表单提交。
这样调整后,元数据类里的验证规则就能正确关联到TaClient模型上,而且刷新模型后也不会丢失验证配置啦。
内容的提问来源于stack exchange,提问作者Valentin Kohler
相关产品推荐
相关产品推荐

