在做MVC+EF CodeFirst 的Demo时,碰到的问题,

在组册用户时,要让用户输入确认密码,但是数据库中又不需要保存这个字段,解决方案很多了,这里我列出通过EF Code First的解决方案。

  1. UserInfo实体
  1. public class UserInfoModel
  2. {
  3. [UIHint("HiddenInput")]
  4. public int UserId { get; set; }
  5. [Display(Name = "用户名")]
  6. public string UserName { get; set; }
  7. [Display(Name = "密码")]
  8. [DataType(DataType.Password)]
  9. public string UserPwd { get; set; }
  10. [Display(Name = "确认密码")]
  11. [DataType(DataType.Password)]
  12. public string ConfirmUserPwd { get; set; }
  13.  
  14. public string Email { get; set; }
  15. public DateTime RegisterDate { get; set; }
  16. [Display(Name = "备注")]
  17. public string Memo { get; set; }
  18. public virtual RoleInfoModel Role { get; set; }
  19. }
  1. //UserInfo的Fluent API 配置类
  2. public class UserInfoConfiguration : EntityTypeConfiguration<UserInfoModel>
  3. {
  4. public UserInfoConfiguration()
  5. {
  6. HasKey(c => c.UserName);
  7. Property(c => c.UserId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
  8.  
  9. //通过Map也可以忽略
  10. //Map(l =>
  11. //{
  12. // l.Properties(x => new { x.UserId, x.UserName, x.UserPwd, x.Email, x.RegisterDate, x.Memo });
  13.  
  14. //});
  15.  
  16. Ignore(c => c.ConfirmUserPwd); //忽略这个属性
  17. }
  18. }
  1. 关于EntityTypeConfiguration<TModel>.Map(),这个方法很强大。
  1. 定义:
  1. public class EntityTypeConfiguration<TEntityType> : StructuralTypeConfiguration<TEntityType> where TEntityType : class
  2. {
  3. //……省略N行
  4. public EntityTypeConfiguration<TEntityType> Map(Action<EntityMappingConfiguration<TEntityType>> entityMappingConfigurationAction);
  5.  
  6. //……
  7.  
  8. }



  1. 具体使用在以下5个方面:
  1. 1.可以实现同一个实体映射到不同的表,也就是分割实体。
  1. 现有StudentInfo实体类如下:
  1. public class Student
  2. {
  3. public Student()
  4. {
  5.  
  6. }
  7. public string StudentId { get; set; }
  8. public string StudentName { get; set; }
  9. public bool Sex { get; set; }
  10. public DateTime Birthday { get; set; }
  11. public string Email { get; set; }
  12. public string QQ { get; set; }
  13. public string MobilePhone { get; set; }
  14. public string FixedPhone { get; set; }
  15. public byte[] Photo { get; set; }
  16. }

  1. public class StudentConfig : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Student>
  2. {
  3. public StudentConfig()
  4. {
  5. HasKey(c => c.StudentId);
  6. Map(c =>
  7. {
  8. c.Properties(l => new { l.StudentName, l.Sex, l.QQ, l.FixedPhone, l.MobilePhone });
  9. c.ToTable("StudentBasicInfo");
  10. });
  11. Map(c =>
  12. {
  13.  
  14. c.Properties(l => new { l.Photo });
  15. c.ToTable("StudentPhoto");
  16. });
  17. }
  18. }

  1. 生成的数据库表:

  1. 2.可以实现多个实体映射到同一个表。
  1. 现有studentstudentphoto实体类:
  1. public class Student
  2. {
  3. public Student()
  4. {
  5.  
  6. }

public string StudentId { get; set; }

  1. public string StudentName { get; set; }
  2. public bool Sex { get; set; }
  3. public DateTime Birthday { get; set; }
  4. public string Email { get; set; }
  5. public string QQ { get; set; }
  6. public string MobilePhone { get; set; }
  7. public string FixedPhone { get; set; }

public StudentPhoto Photo { get; set; }

  1. }
  2.  
  3. public class StudentPhoto
  4. {

public string StudentId { get; set; }

  1. public byte[] Photo { get; set; }

public Student student { get; set; }

  1. }
  1.  


  1. public class StudentConfig : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Student>
  2. {
  3. public StudentConfig()
  4. {
  5. HasKey(c => c.StudentId);

HasRequired(c => c.Photo).WithRequiredDependent(c => c.student);

  1. ToTable("student");
  2. }
  3. }
  4. public class StudentPhotoConfig : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<StudentPhoto>
  5. {
  6. public StudentPhotoConfig()
  7. {
  8. HasKey(c => c.StudentId);
  9. ToTable("student");
  10. }
  11. }

  1. 要实现这个功能要注意以下几点:
  1. 1.实体之间要有一对一的关系(实体中绿色字体)
  1. 2.实体之间要有完全相同的主键(实体中红色字体)
  1. 3.配着类中要指明一对一的关系(StudentConfig 类中红色字体)
  1. 4.相同的表名。(ToTable("student");)
  1. 生成的数据库表:
  1.  
  1. 3.可以实现每个层次结构一张表 (TPH) 继承
  1. 4.可以实现每个类型一张表 (TPT) 继承
  1. 5.可以实现每个具体类型一张表 (TPC) 继承



Entity Framework Code First 中使用 Fluent API 笔记。的更多相关文章

  1. Entity Framework(七):Fluent API配置案例

    一.配置主键 要显式将某个属性设置为主键,可使用 HasKey 方法.在以下示例中,使用了 HasKey 方法对 Product 类型配置 ProductId 主键. 1.新加Product类 usi ...

  2. Entity Framework Code First实体对象变动跟踪

    Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理. 变动跟踪快照:前面 ...

  3. Entity Framework Code First 学习日记(1)精

    我最近几天正在学习Entity Framework Code First.我打算分享一系列的学习笔记,今天是第一部分: 为什么要使用Code First: 近 年来,随着domain driven d ...

  4. Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)

    在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...

  5. How to: Use the Entity Framework Code First in XAF 如何:在 XAF 中使用EF CodeFirst

    This topic demonstrates how to create a simple XAF application with a business model in a DbContext ...

  6. Entity Framework Code First属性映射约定

    Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...

  7. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  8. Entity Framework Code First (三)Data Annotations

    Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...

  9. Entity Framework Code First (二)Custom Conventions

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. ElasticSearch ik分词安装

    1.下载对应版本的ES ik分词 https://github.com/medcl/elasticsearch-analysis-ik/releases 2.解压elasticsearch-analy ...

  2. Juint整合Log4j

    一般Log4j配置在web.xml中,在单元测试时,不需要启动Tomcat,所有Log4j找不到配置文件 在测试类中手动加载 配置文件 PropertyConfigurator.configure(& ...

  3. JAVA集合

    为了保存数量不确定的数据或者提供映射关系的数据,Java提供了集合类,也称作集合类,Collection和Map分别为两个根接口.两个接口体系的继承系如下图 (图片来源于网络) Collection接 ...

  4. Derived Column 用法

    Derived Column Component 用法是为数据流增加派生列,Derived column  有两种用法:add as new column 或 replace . 图中,增加一个 De ...

  5. 前端MVC框架Backbone 1.1.0源码分析系列

    Backbone.js 是一个在JavaScript环境下的 模型-视图-控制器 (MVC) 框架.任何接触较大规模项目的开发人员一定会苦恼于各种琐碎的事件回调逻辑.以及金字塔般的代码.而且,在传统的 ...

  6. MySQL utf8mb4 字符集:支持 emoji 表情符号

    转载地址:http://www.linuxidc.com/Linux/2013-05/84360.htm 我用他的方法解决了问题,亲测可用,不要用Nnvicat for Mysql去查询编码,在服务器 ...

  7. CSS之水平垂直居中

    在css的世界里,如果我们想让一个块级元素水平居中,想必大家都知道利用margin:0 auto;嘛,这样就可以让块级元素在它的父元素中水平居中了. 列如这样: <!DOCTYPE html&g ...

  8. Notes:DOM的事件模拟

    首先使用document对象的createEvent方法创建一个事件对象,然后初始化该事件对象,接着使用支持事件DOM节点的dispatchEvent方法触发事件. DOM2级事件和DOM3级事件有些 ...

  9. csapp2e-chapter2-homework

    一 前言 看了csapp2e第二章,感觉讲的很透彻,理解了一些以前学组成原理没有学懂的东西.这章最让我感觉深刻的还是计算机是怎么实现c语言中的基本数据类型的表示和操作的,这对程序员理解程序无疑是帮助巨 ...

  10. pixi.js教程中文版--基础篇

    前言 Pixi.js使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库.提供无缝 C ...