asp.net mvc5 DataBase First下model校验问题(MetadataType使用)
最近学习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的使用代码如下:
using System;
using System.ComponentModel.DataAnnotations;
namespace Blog.Model
{
[MetadataType(typeof(UsersMetaData))]
public partial class Users
{
/// <summary>
/// 新增的一个校验两次密码的属性
/// </summary>
[DataType(DataType.Password)]
[Display(Name = "确认密码")]
[Compare("Password", ErrorMessage = "密码和确认密码不匹配。")]
public string ConfirmPassword { get; set; }
}
public class UsersMetaData
{ [Display(Name = "用户名")]
[Required(ErrorMessage = ("请输入{0}!"))]
public string UserName { get; set; } [Display(Name = "用户姓名")]
[Required(ErrorMessage = ("请输入{0}!"))]
public string UserRealName { get; set; } [Display(Name = "密码")]
[Required(ErrorMessage = ("请输入{0}"))]
[DataType(DataType.Password)]
[StringLength(, ErrorMessage = "{0}的长度在{2}和{1}之间", MinimumLength = )]
public string Password { get; set; } }
}
数据注解和验证属性需要引用System.ComponentModel.DataAnnotations命名空间,如此处理后不论是自定义验证属性还是新增属性都是ok,在mvc项目中引用当前项目的引用,就能完成达到我们的目的
这个仅仅属于一个小技巧,如果是model first或者code first就完全不需要如此了
asp.net mvc5 DataBase First下model校验问题(MetadataType使用)的更多相关文章
- ASP.NET MVC5 学习笔记-3 Model
1. Model 1.1 添加一个模型 注意,添加属性时可以输入"prop",会自动输入代码段. public class CheckoutAccount { public int ...
- asp.net mvc5 设置Area下的为启动页
只需修改App_Start文件夹下RouteConfig中RegisterRoutes方法 public static void RegisterRoutes(RouteCollection rout ...
- 四、 添加模型Model(ASP.NET MVC5 系列)
在这一章节中我们将添加一些classes类来管理数据库中的movies.这些classes类就是ASP.NET MVC应用程序中的"model". 我们将用.NET框架中的数据访问 ...
- 彻底解决asp.net mvc5.2.2:vs2013 cshtml视图文件报错(当前上下文中不存在名称“model”,ViewBag,Url)
最近遇到一个奇葩的问题,在vs2013下cshtml视图文件报错,出现当前上下文中不存在名称“model”,ViewBag,Url等等),在视图中也没有智能提示了,用@model声明视图的model类 ...
- Linux(CentOS 6.5)下配置Mono和Jexus并且部署ASP.NET MVC5
1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有 ...
- 《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式
作者:张博出处:http://yilin.cnblogs.com Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发 ...
- Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性
今天有个同事问到,在使用Entity Framework 的Database frist或model first时,怎么在model上添加验证的特性? 因为此时的Model是是VS 工具怎么生成的,直 ...
- asp.net mvc5 使用百度ueditor 本编辑器完整示例(下)配置上传播放视频
通过 asp.net mvc5 使用百度ueditor 本编辑器完整示例(上)介绍,可以上传图片到服务器了,也可以上传小的视频文件,并且由百度编辑器自动加入html5<video>标签播放 ...
- ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合
建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...
随机推荐
- Java实现ModbusTCP通信
一个项目,需要用Java实现使用ModbusTCP和硬件设备通信 资料 代码下载 本文的代码和仿真软件:蓝奏云下载 官网资料 Modbus官网 Modbus协议 Modbus技术资源 MODBUS T ...
- java调用js脚本
有些情况下,需要java去调用js,groovy等脚本语言,传入参数获取脚本运行的结果. js脚本例子: function add(a,b){ return a + b + number; } jav ...
- yum命令配置及使用说明和常见问题处理
一. 重装yum 1. 执行如下命令,卸载yum命令程序 rpm -qa |grep yum |xargs rpm -e --nodeps 2. 依次执行如下命令,下载yum.yum-plugin-f ...
- oracle自增主键
本文参考-https://www.cnblogs.com/xxaxx/p/3584036.html oracle没有像sqlserver中identity一样的函数,需要依赖于序列.触发器来实现自增主 ...
- 设计模式七大原则(C++描述)
前言 最近在学习一些基本的设计模式,发现很多博客都是写了六个原则,但我认为有7个原则,并且我认为在编码中思想还是挺重要,所以写下一篇博客来总结下 之后有机会会写下一些设计模式的博客(咕咕咕...... ...
- 在图中寻找最短路径-----深度优先算法C++实现
求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例 ...
- linux基础命令笔记
配置IP地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0 忘记root密码grub e 选择kernel按e 输入single b 1:目录及文件的基本操 ...
- 我的vim开发环境搭建:C/C++/Go,持续更新中
懒得在github博客上折腾评论功能,先借用博客园推广下,虽然好像也没什么用. 我的vim开发环境搭建(1): 准备工作 我的vim开发环境搭建(2): 常用的vim插件 我的vim开发环境搭建(3) ...
- PHP新特性
1.太空船操作符<=> 2.变量类型限定 3.$a = $b??$c 4.常量数组,define($arr,['a','b']) 5.namespace批量导入 等等
- Java核心1(第三章)
3.6字符串 子串substring(a,b)方法 第二个参数是不想复制的第一个位置 可以从一个较大的字符串中提取一个子串 3.6.2拼接 Java允许使用+号链接两个字符串 3.6.3不可 ...