asp.net mvc5 DataBase First下model校验问题
最近学习asp.net mvc5,使用 asp.net mvc5+EF6+AutoFac做个小Demo,其中是先设计的数据库表,就直接选择了EF的DataBase First(三种开发模式分别是code first,model first和database first)
新建了一个专门的mode项目用于存放EF生成的model信息,那么问题来了,在新建的asp.net mvc5项目中同样有用于数据注解和验证的model,这两个model很大一部分会有重合,这就让人不想再去
在数据交互中手动的对应转换填充 数据库model和页面数据注解验证model了,这时我们可以把asp.net mvc项目下的model对象转移到存放到EF生成model信息的项目下。
图1
如图1,Blog.edmx 本质是一个xml文件, 用来存放解析存储模型、概念模型以及这两者之间的映射,其中BLog.tt是一个T4模板文件用于生成其下对应的数据模型对象
当然如果我们直接修改这些model对象的数据验证属性也是可以的, 但是当数据库发生变化时更新模型时这些model对象上的数据校验属性就会被覆盖
那么这个时候我们可以新建一个model对象通过MetadataType属性来指定要与数据模型类关联的元数据类,如图1所示在Blog.edmx之上有一个Model文件夹用户存放关联的元数据类。
MetadataType的使用代码如下:
1 using System; 2 using System.ComponentModel.DataAnnotations; 3 namespace Blog.Model 4 { 5 [MetadataType(typeof(UsersMetaData))] 6 public partial class Users 7 { 8 /// <summary> 9 /// 新增的一个校验两次密码的属性 10 /// </summary> 11 [DataType(DataType.Password)] 12 [Display(Name = "确认密码")] 13 [Compare("Password", ErrorMessage = "密码和确认密码不匹配。")] 14 public string ConfirmPassword { get; set; } 15 } 16 public class UsersMetaData 17 { 18 19 [Display(Name = "用户名")] 20 [Required(ErrorMessage = ("请输入{0}!"))] 21 public string UserName { get; set; } 22 23 [Display(Name = "用户姓名")] 24 [Required(ErrorMessage = ("请输入{0}!"))] 25 public string UserRealName { get; set; } 26 27 [Display(Name = "密码")] 28 [Required(ErrorMessage = ("请输入{0}"))] 29 [DataType(DataType.Password)] 30 [StringLength(50, ErrorMessage = "{0}的长度在{2}和{1}之间", MinimumLength = 6)] 31 public string Password { get; set; } 32 33 34 } 35 }
数据注解和验证属性需要引用System.ComponentModel.DataAnnotations命名空间,如此处理后不论是自定义验证属性还是新增属性都是ok,在mvc项目中引用当前项目的引用,就能完成达到我们的目的
这个仅仅属于一个小技巧,如果是model first或者code first就完全不需要如此了
原文地址:https://www.cnblogs.com/zmxmiss/p/11744166.html
- jqGrid 关闭刷新父页面数据
- [MyBatis]诡异的Invalid bound statement (not found)错误
- jfinal自定义freemarker标签
- Angrok 一个内网穿透服务
- Druid数据库连接池 实现数据库账号密码加密
- 【maven学习】划分模块
- 缓存策略优化
- Quartz框架应用(1)
- 6个编写优质干净代码的技巧
- 【Jfinal源码】第一章 com.jfinal.core.JFinalFilter(1)
- 【ehcache】 timeToLiveSeconds 和 timeToLiveSeconds 的区别
- 升级 CentOS7 、Redis 3.2.x 的问题
- AngularJS 中使用Swiper制作滚动图不能滑动
- JAVA服务端配置允许跨域请求
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用Django获取Linux性能数据并存放在redis中
- MySQL组复制(MGR)全解析 Part 5 MGR单主模式部署指南
- php学习day4
- 使用Python爬取动态网页-腾讯动漫(Selenium)
- MySQL 5.7 常用命令
- MySQL复制全解析 Part 5 MySQL GTID的格式和存储
- Mycat分库分表全解析 Part 1 数据库切分概述
- RoarCTF2019-EasyJava
- ACTF2020新生赛-BackupFile
- DB2 Linux平台安装 Part 5 数据库常见参数配置
- GXYCTF2019-PingPingPing
- 利用cloudflareWorkers制作Google镜像站
- MySQL information_schema详解 COLLATIONS
- 极客大挑战2019-Knife
- DB2备份还原相关操作